Que el nombre “Google” va más allá de un simple buscador es sabido desde hace tiempo. Su catálogo de productos abarca servicios web como Google Maps, pla­ta­fo­r­mas de en­tre­te­ni­mie­n­to como YouTube o Google Music, apli­ca­cio­nes de co­mu­ni­ca­ción como Gmail, so­lu­cio­nes ofi­má­ti­cas como Google Docs y hardware con el sma­r­t­pho­ne Pixel de la casa. No contenta con esto, la compañía su­mi­ni­s­tra desde hace algunos años he­rra­mie­n­tas de software para la sa­ti­s­fa­c­ción de pro­gra­ma­do­res y de­sa­rro­lla­do­res web. Desde 2012, el cada vez más popular lenguaje de pro­gra­ma­ción Go, am­plia­me­n­te conocido como Golang (Go Pro­gra­m­mi­ng Language), tiene también un lugar en el extenso porfolio de la empresa de Silicon Valley.

¿Qué es Golang?

En se­p­tie­m­bre de 2007, tres pro­gra­ma­do­res de la plantilla de Google, Robert Griesemer, Rob Pike y Ken Thompson, pre­se­n­ta­ron sus ideas para un lenguaje de pro­gra­ma­ción op­ti­mi­za­do y más sencillo, sentando así las bases de Go. Lo que comenzó siendo un proyecto modesto se convirtió pronto en un ambicioso propósito cuyo de­sa­rro­llo se vio impulsado por Google, que dispuso todos los recursos ne­ce­sa­rios para ello. Desde que se publicara ofi­cia­l­me­n­te como proyecto open source con licencia BSD a finales de 2011, a Go no le ha sido difícil rodearse de una amplia comunidad que hasta el día de hoy no ha dejado de colaborar ac­ti­va­me­n­te en su continuo de­sa­rro­llo y en su op­ti­mi­za­ción. La primera versión estable (1.0) se publicó el 28 de marzo de 2012 y desde la versión 1.1 (un año después) Google publica ac­tua­li­za­cio­nes cada medio año.

Hecho

Tanto el logo como la mascota de Golang –una taltuza, roedor de la familia de los geómidos propio de grandes regiones de América– son obra del diseñador Renée French, autor también de Glenda, la liebre de Plan 9. Rob Pike y Ken Thompson es­tu­vie­ron im­pli­ca­dos en el de­sa­rro­llo del sistema operativo Unix en los Bell Labs a lo largo de los años 1980.

La sintaxis de Golang tiene muchas se­me­ja­n­zas con la sintaxis básica de los lenguajes de la familia C, pero muestra una fuerte in­flue­n­cia de los lenguajes Pascal, Modula y Oberon, de­sa­rro­lla­dos por Niklaus Wirth. También revela aspectos de lenguajes como Newsqueak y Limbo, que a su vez se inspiran en CSP (Co­m­mu­ni­ca­ti­ng Se­que­n­tial Processes), de Tony Hoares. Golang es un lenguaje compilado, si bien desde el principio se da gran im­po­r­ta­n­cia a una elevada velocidad de tra­du­c­ción. El lenguaje también cuenta con un re­co­le­c­tor de basura au­to­má­ti­co (Gargabe Co­lle­c­tion o GC), que co­n­tri­bu­ye a gestionar con efi­cie­n­cia la memoria di­s­po­ni­ble y reduce así los problemas de espacio.

Qué hace tan especial a Golang

A pesar de que Golang, en co­m­pa­ra­ción con otros lenguajes, aún es re­la­ti­va­me­n­te joven, es tan maduro y estable al mismo tiempo, que de­sa­rro­lla­do­res de todo el mundo –incluso Google– ya han sucumbido a sus po­si­bi­li­da­des. Sus pri­n­ci­pa­les virtudes son la si­m­pli­ci­dad y la mu­l­ti­fu­n­cio­na­li­dad, aspectos que han pe­r­se­gui­do sus autores desde el principio. La principal mo­ti­va­ción que ha guiado su de­sa­rro­llo tiene que ver pre­ci­sa­me­n­te con la in­sa­ti­s­fa­c­ción re­su­l­ta­n­te de la oferta di­s­po­ni­ble en el momento, compuesta por lenguajes que de­s­ta­ca­ban por ser muy efi­cie­n­tes al compilar código, por eje­cu­tar­lo rá­pi­da­me­n­te o por pro­gra­mar­se fá­ci­l­me­n­te, pero nunca por las tres ventajas a la vez.

Al combinar lo mejor de cada familia, Golang se adelanta al resto co­n­s­ti­tu­ye­n­do un buen modelo a seguir. El lenguaje de­sa­rro­lla­do por Google aúna la facilidad de la pro­gra­ma­ción de los lenguajes in­te­r­pre­ta­dos y dinámicos y la efi­cie­n­cia y la seguridad de un lenguaje compilado de tipado estático (sta­ti­ca­lly typed). A esto se añade que la es­tru­c­tu­ra de Go obedece a la finalidad de acortar el proceso de de­sa­rro­llo de modo que también permita crear en un solo ordenador grandes archivos eje­cu­ta­bles en poco tiempo. Algunas de las ca­ra­c­te­rí­s­ti­cas di­s­ti­n­ti­vas con las cuales puede al­ca­n­zar­se este nivel de calidad son las si­guie­n­tes:

  • Un sistema de tipos ligero pero expresivo que permite cla­si­fi­car y di­fe­re­n­ciar objetos (variables, funciones, etc.)
  • Co­n­cu­rre­n­cia (cálculos si­mu­l­tá­neos), que permite una ejecución más rápida de los programas
  • El me­n­cio­na­do re­co­le­c­tor de basura para usar ra­cio­na­l­me­n­te la memoria y evitar problemas de espacio
  • Una estricta es­pe­ci­fi­ca­ción de de­pe­n­de­n­cias sin una sintaxis de de­cla­ra­cio­nes compleja
  • Mu­l­ti­pla­ta­fo­r­ma, para usar las apli­ca­cio­nes de­sa­rro­lla­das en cualquier sistema

Programar con Golang: ¿es tan fácil como dicen?

La sintaxis de Go tiene mucho en común con la clásica sintaxis de C, si bien se di­fe­re­n­cia de este lenguaje, de­sa­rro­lla­do ya en 1972, por una serie de pequeñas mejoras y un menor volumen. Entre estos cambios cabe mencionar que al programar con Go ya no son ne­ce­sa­rios los pa­ré­n­te­sis de las co­n­di­cio­nes y los bucles, y el punto y coma de cierre típico de los lenguajes C es opcional. Asimismo, Go permite regular la validez de los ide­n­ti­fi­ca­do­res (para variables, funciones, etc.) por medio de la escritura (mayúscula o minúscula): si un ide­n­ti­fi­ca­dor ha de pe­r­ma­ne­cer activo fuera de un paquete Go, solo hay que escribir la inicial en mayúscula.

A co­n­ti­nua­ción se enumeran otras pe­cu­lia­ri­da­des de la pro­gra­ma­ción con Golang:

  • Variable de entorno GOPATH como base: uno de los primeros pasos obli­ga­to­rios al programar con Golang consiste en crear el di­re­c­to­rio GOPATH junto con los tres su­b­di­re­c­to­rios “src” (archivos fuente de Go), “pkg” (objetos paquete de Go o package objects) y “bin” (comandos eje­cu­ta­bles). Es en este espacio, que puede lo­ca­li­zar­se li­bre­me­n­te, donde se gestiona el código obli­ga­to­rio con sus de­pe­n­de­n­cias.
     
  • De­sa­rro­llo modular con paquetes GOLANG: los archivos fuente se organizan en di­re­c­to­rios que se ide­n­ti­fi­can como paquetes (packages). El nombre del di­re­c­to­rio es idéntico al del paquete al cual pe­r­te­ne­cen los archivos fuente co­n­te­ni­dos en este di­re­c­to­rio. Si hay funciones o tipos que deben usarse más allá de su paquete se emplea la mayúscula.
     
  • Formato de código uniforme y pre­de­fi­ni­do: Golang prescribe ciertas co­n­ve­n­cio­nes para el formato del código, como es, por ejemplo, el espacio exacto entre los elementos. Esto hace que, una vez se ha aprendido a programar apli­ca­cio­nes con Golang, sea muy fácil leer el código de otros de­sa­rro­lla­do­res sin tener que descifrar su estilo personal, como ocurre con otros lenguajes. Con todo, no es necesario prestar atención excesiva a todos los detalles, puesto que la he­rra­mie­n­ta integrada gofmt optimiza el código escrito au­to­má­ti­ca­me­n­te, co­rri­gie­n­do eve­n­tua­les errores de formato.
     
  • Relative imports por defecto: todos los archivos y paquetes que se importan a proyectos Golang (propios o ajenos) son siempre relativos al di­re­c­to­rio GOPATH/src, lo que si­m­pli­fi­ca el proceso de im­po­r­ta­ción. Además, Go no compila los elementos que importa si no se utilizan. Esto garantiza que el código se mantenga limpio en caso de que los elementos im­po­r­ta­dos no se usen o hayan dejado de hacerlo.
     
  • Valores de de­vo­lu­ción múltiples para funciones y métodos: con Go se pueden crear funciones y métodos capaces de devolver varios valores di­fe­re­n­tes. De esta forma, Go puede devolver cla­ra­me­n­te separados un resultado válido y un error es­pe­ci­fi­ca­do de forma al­te­r­na­ti­va. En C, en cambio, los errores de escritura se muestran con un valor numérico negativo, mientras que el código de error se guarda aparte.

Ventajas y apli­ca­ción de Golang

Ya se han me­n­cio­na­do muchos de los pri­n­ci­pa­les puntos fuertes de Golang. Gracias a su si­m­pli­ci­dad, el lenguaje de Google ofrece a los pro­gra­ma­do­res mucha más comodidad que otros lenguajes. Una vez asumida la teoría básica, es fácil sacar provecho de su facilidad de uso y de los numerosos me­ca­ni­s­mos au­to­ma­ti­za­dos que resultan en un co­n­si­de­ra­ble ahorro de tiempo. Con estas he­rra­mie­n­tas, entre ellas la me­n­cio­na­da op­ti­mi­za­ción autónoma del código con gofmt, Go aporta la respuesta idónea a las tareas cada vez más exigentes del de­sa­rro­lla­dor de software. A esto se suma el hecho de que el código de Golang siempre tiene el mismo formato, lo que facilita en gran medida su le­gi­bi­li­dad y con ello, sobre todo, el trabajo en equipo.

Otro aspecto de­s­ta­ca­ble de la pro­gra­ma­ción con Golang es su buen re­n­di­mie­n­to. La velocidad de ejecución de las apli­ca­cio­nes Go saca buena nota si se compara con otros lenguajes co­m­pi­la­do­res. Su velocidad de co­m­pi­la­ción encuentra parangón a grandes rasgos con la de Java, por ejemplo, pero, mientras muchas apli­ca­cio­nes Java se basan en el framework Spring y esto hace que al iniciarse necesiten cierto tiempo hasta poder responder pe­ti­cio­nes HTTP, los servicios Golang tardan menos en iniciarse porque utilizan las im­ple­me­n­ta­cio­nes di­s­po­ni­bles de la bi­blio­te­ca estándar.

En co­n­se­cue­n­cia, no es de extrañar que hasta ahora Golang haya en­co­n­tra­do sobre todo apli­ca­ción en empresas y en el entorno de los se­r­vi­do­res, ámbitos en donde la es­ta­bi­li­dad y el re­n­di­mie­n­to de los servicios juegan un rol es­pe­cia­l­me­n­te im­po­r­ta­n­te. Es sobre todo en la vi­r­tua­li­za­ción basada en co­n­te­ne­do­res donde hay especial demanda de este joven lenguaje de pro­gra­ma­ción, lo que también guarda relación con que Docker, el re­pre­se­n­ta­n­te más pro­mi­ne­n­te de las pla­ta­fo­r­mas de co­n­te­ne­do­res, esté basado en Go.

La otra cara de Go Pro­gra­m­mi­ng Language: ¿en qué le superan otros lenguajes?

Con toda la alabanza que se merece este moderno lenguaje, también es co­n­ve­nie­n­te poner algunas de sus de­bi­li­da­des de relieve. Estas se deben pri­n­ci­pa­l­me­n­te a su si­m­pli­ci­dad, que aunque por un lado re­pre­se­n­ta su mayor ventaja, por el otro co­n­tri­bu­ye a la falta de algunas facetas que muchos pro­gra­ma­do­res aprecian mucho en otros lenguajes.

La más relevante es pro­ba­ble­me­n­te la ausencia de tipos genéricos (tipos de datos que permiten indicar pa­rá­me­tros tipo in­di­vi­dua­les) en la bi­blio­te­ca estándar. Los de­fe­n­so­res de la pro­gra­ma­ción con tipos y aquellos aco­s­tu­m­bra­dos al uso de Generics en Java han buscado en vano una cualidad similar en Go hasta ahora, si bien el equipo de Go no excluye la im­ple­me­n­ta­ción de tipos genéricos en una versión futura. Muchos pro­gra­ma­do­res también tendrían que aco­s­tu­m­brar­se a no usar clases, herencias y co­n­s­tru­c­to­res. Una ca­ra­c­te­rí­s­ti­ca de Go no siempre deseada es la ocu­l­ta­ción au­to­má­ti­ca de archivos im­po­r­ta­dos no activos. Otros lenguajes tienen la ventaja de extraer los co­m­po­ne­n­tes en cuestión de los co­me­n­ta­rios de modo que pe­r­ma­ne­z­can en el código a pesar de su inac­ti­vi­dad.

Por último, otra de­s­ve­n­ta­ja de Golang frente a robustos veteranos como C, C++, etc., reside en su historia re­la­ti­va­me­n­te corta. Esto hace que disponga de un arsenal mucho más pequeño de paquetes im­ple­me­n­ta­dos por defecto y pre­pa­ra­dos para su im­po­r­ta­ción. Además, el número de manuales di­s­po­ni­ble en la red para Go es aún menor que el que puede en­co­n­trar­se para los lenguajes más co­n­so­li­da­dos.

Resumen de las ventajas y de­s­ve­n­ta­jas de Golang

Ventajas De­s­ve­n­ta­jas
Mu­l­ti­pla­ta­fo­r­ma No soporta tipos genéricos
Sintaxis muy si­m­pli­fi­ca­da Orientado a objetos (solo pa­r­cia­l­me­n­te)
Gestión au­to­má­ti­ca de la memoria (re­co­le­c­tor de basura) Soporte ampliable de IDE (entornos in­te­gra­dos de ejecución)
Formato de código unitario Oferta limitada de bi­blio­te­cas y paquetes externos
Im­po­r­ta­cion más sencilla Cambiar de lenguajes clásicos orie­n­ta­dos a objetos como Java o C++ requiere esfuerzo
Admite di­fe­re­n­tes valores de de­vo­lu­ción para funciones y métodos Hasta ahora pocos manuales y expertos
Co­rre­c­ción de código au­to­ma­ti­za­da (gofmt)
Co­n­cu­rre­n­cia
Extensa bi­blio­te­ca estándar, sobre todo para HTTP y tareas de red

Co­n­clu­sión: ¿a quién le conviene aprender a trabajar con Golang?

Una vez ana­li­za­dos los fu­n­da­me­n­tos y las pe­cu­lia­ri­da­des de este lenguaje de pro­gra­ma­ción libre, surge de forma lógica una pregunta: ¿quién debería hacer el esfuerzo de aprender a escribir con Golang? Como es natural, no es posible dar una respuesta universal, puesto que Go no se ha de­sa­rro­lla­do con el fin de sustituir a todos los lenguajes conocidos, sino con el de erigirse como al­te­r­na­ti­va. Gracias a su eficacia y a su ex­trao­r­di­na­rio re­n­di­mie­n­to, aspectos que se reflejan también en las apli­ca­cio­nes que se programan con él, Go es una in­te­re­sa­n­te opción es­pe­cia­l­me­n­te en los ámbitos de los negocios y los se­r­vi­do­res. Cuanto más código deba es­cri­bi­r­se y co­m­pi­lar­se, más claras son sus ventajas.

Para los apre­n­di­ces en pro­gra­ma­ción el proceso de apre­n­di­za­je resulta bastante más fácil, sacando provecho de la sencillez de este lenguaje, la cual puede al mismo tiempo ser fru­s­tra­n­te para los más ex­pe­ri­me­n­ta­dos debido a sus si­mi­li­tu­des con C o Java. Pero si se superan las molestias ligadas al cambio de uno a otro, también los “viejos” pro­gra­ma­do­res podrían ser capaces de apreciar sus virtudes. Como el mercado de expertos en Go aún no es muy amplio, conocer el lenguaje de Google no deja de re­pre­se­n­tar una gran opo­r­tu­ni­dad tanto laboral, a la hora de pre­se­n­tar­se a un puesto como pro­gra­ma­dor, como privada, de cara a de­sa­rro­llar una idea propia.

Ir al menú principal