¿Para qué sirve realmente el idioma Go?

Durante sus más de nueve años en la naturaleza, el lenguaje Go de Google, también conocido como Golang, con la versión 1.13 disponible en septiembre de 2019, ha pasado de ser una curiosidad para los geeks alfa a ser el lenguaje de programación probado en batalla detrás de algunos de los más importantes del mundo. proyectos centrados en la nube. 

¿Por qué Go fue elegido por los desarrolladores de proyectos como Docker y Kubernetes? ¿Cuáles son las características definitorias de Go, en qué se diferencia de otros lenguajes de programación y qué tipo de proyectos es más adecuado para la construcción? En este artículo, exploraremos el conjunto de funciones de Go, los casos de uso óptimos, las omisiones y limitaciones del idioma y hacia dónde se dirige Go desde aquí.

Go language es pequeño y simple

Go, o Golang como se le llama a menudo, fue desarrollado por empleados de Google, principalmente el gurú de Unix e ingeniero distinguido de Google Rob Pike, pero no es estrictamente hablando un "proyecto de Google". Más bien, Go se desarrolla como un proyecto de código abierto dirigido por la comunidad, encabezado por un liderazgo que tiene opiniones sólidas sobre cómo se debe usar Go y la dirección que debe tomar el lenguaje.

Go está diseñado para ser fácil de aprender, sencillo de trabajar y fácil de leer para otros desarrolladores. Go no tiene un gran conjunto de funciones, especialmente en comparación con lenguajes como C ++. Go recuerda a C en su sintaxis, lo que hace que sea relativamente fácil de aprender para los desarrolladores de C veteranos. Dicho esto, muchas características de Go, especialmente sus características de programación funcional y concurrencia, se remontan a lenguajes como Erlang.

Como lenguaje similar a C para crear y mantener aplicaciones empresariales multiplataforma de todo tipo, Go tiene mucho en común con Java. Y como un medio para permitir el desarrollo rápido de código que podría ejecutarse en cualquier lugar, podría establecer un paralelo entre Go y Python, aunque las diferencias son mucho mayores que las similitudes.

Go language tiene algo para todos

La documentación de Go describe a Go como "un lenguaje compilado rápido, de tipado estático que se siente como un lenguaje interpretado de tipado dinámico". Incluso un programa Go grande se compilará en cuestión de segundos. Además, Go evita gran parte de la sobrecarga de archivos y bibliotecas de inclusión de estilo C.

Go facilita la vida del desarrollador de varias formas:

  • Conveniencia.  Go se ha comparado con lenguajes de scripting como Python en su capacidad para satisfacer muchas necesidades de programación comunes. Algunas de estas funciones están integradas en el propio lenguaje, como "goroutines" para la simultaneidad y el comportamiento de hilos, mientras que las capacidades adicionales están disponibles en los paquetes de biblioteca estándar de Go, como el paquete http de Go. Al igual que Python, Go proporciona capacidades de administración de memoria automática, incluida la recolección de basura.

    A diferencia de los lenguajes de programación como Python, el código de Go se compila en un binario nativo de ejecución rápida. Y a diferencia de C o C ++, Go se compila extremadamente rápido, lo suficientemente rápido para que trabajar con Go se sienta más como trabajar con un lenguaje de scripting que con un lenguaje compilado. Además, el sistema de compilación Go es menos complejo que los de otros lenguajes compilados. Se necesitan pocos pasos y poca contabilidad para crear y ejecutar un proyecto Go.

  • Velocidad.  Los binarios de Go se ejecutan más lentamente que sus homólogos de C, pero la diferencia de velocidad es insignificante para la mayoría de las aplicaciones. El rendimiento de Go es tan bueno como C para la gran mayoría del trabajo y, en general, mucho más rápido que otros lenguajes conocidos por su velocidad de desarrollo (por ejemplo, JavaScript, Python y Ruby).
  • Portabilidad.  Los ejecutables creados con la cadena de herramientas de Go pueden ser independientes, sin dependencias externas predeterminadas. La cadena de herramientas de Go está disponible para una amplia variedad de sistemas operativos y plataformas de hardware, y se puede utilizar para compilar binarios entre plataformas.
  • Interoperabilidad.  Go ofrece todo lo anterior sin sacrificar el acceso al sistema subyacente. Los programas Go pueden comunicarse con bibliotecas C externas o realizar llamadas nativas al sistema. En Docker, por ejemplo, Go interactúa con funciones de Linux de bajo nivel, cgroups y espacios de nombres para trabajar con la magia de los contenedores.
  • Apoyo.  La cadena de herramientas Go está disponible gratuitamente como binario de Linux, MacOS o Windows o como contenedor de Docker. Go se incluye de forma predeterminada en muchas distribuciones populares de Linux, como Red Hat Enterprise Linux y Fedora, lo que facilita la implementación de Go source en esas plataformas. El soporte para Go también es sólido en muchos entornos de desarrollo de terceros, desde Microsoft Visual Studio Code hasta el IDE de Komodo de ActiveState.

Dónde funciona mejor el idioma de Go

Ningún idioma es adecuado para todos los trabajos, pero algunos idiomas se adaptan a más trabajos que otros.

Go brilla más para desarrollar los siguientes tipos de aplicaciones:

  • Servicios distribuidos en red. Las aplicaciones de red viven y mueren por concurrencia, y las características de concurrencia nativas de Go, principalmente rutinas y canales, son adecuadas para este tipo de trabajo. En consecuencia, muchos proyectos de Go son para redes, funciones distribuidas y servicios en la nube: API, servidores web, marcos mínimos para aplicaciones web y similares.
  • Desarrollo nativo de la nube. Las funciones de red y simultaneidad de Go, y su alto grado de portabilidad, lo hacen adecuado para crear aplicaciones nativas de la nube. De hecho, Go se utilizó para construir varios pilares de la computación nativa de la nube, incluidos Docker, Kubernetes e Istio.
  • Reemplazos de infraestructura existente. Gran parte del software del que dependemos para la infraestructura de Internet está envejeciendo y repleto de exploits. Reescribir estas cosas en Go ofrece muchas ventajas: mayor seguridad de la memoria, implementación multiplataforma más sencilla y una base de código limpia para promover el mantenimiento futuro. Un nuevo servidor SSH llamado Teleport y una nueva versión del Network Time Protocol se están escribiendo en Go y se ofrecen como reemplazos para sus contrapartes convencionales.
  • Utilidades y herramientas independientes. Go los programas se compilan en binarios con dependencias externas mínimas. Eso los hace ideales para la creación de utilidades y otras herramientas, ya que se inician rápidamente y se pueden empaquetar fácilmente para su redistribución.

Ir limitaciones de idioma

El obstinado conjunto de características de Go ha recibido elogios y críticas. Go está diseñado para pecar de ser pequeño y fácil de entender, con ciertas características omitidas deliberadamente. El resultado es que algunas funciones que son comunes en otros idiomas simplemente no están disponibles en Go, a propósito.

Una de esas características son los genéricos, que permiten que una función acepte muchos tipos diferentes de variables. Go no incluye genéricos, y los administradores del lenguaje están en contra de agregarlos, sobre la base de que los genéricos comprometerían la simplicidad del lenguaje. Es posible evitar esta limitación, pero muchos desarrolladores todavía están ansiosos por ver genéricos agregados a Go de alguna manera. Se ha planteado al menos una propuesta para implementar genéricos en Go, pero no se ha escrito nada en piedra.

Otro inconveniente de Go es el tamaño de los binarios generados. Los binarios de Go se compilan estáticamente de forma predeterminada, lo que significa que todo lo necesario en tiempo de ejecución se incluye en la imagen binaria. Este enfoque simplifica el proceso de construcción e implementación, pero a costa de un simple "¡Hola, mundo!" con un peso de alrededor de 1,5 MB en Windows de 64 bits. El equipo de Go ha estado trabajando para reducir el tamaño de esos binarios con cada lanzamiento sucesivo. También es posible reducir los archivos binarios de Go con compresión o eliminando la información de depuración de Go. Esta última opción puede funcionar mejor para aplicaciones distribuidas independientes que para servicios de red o en la nube, donde tener información de depuración es útil si un servicio falla en su lugar.

Otra característica promocionada de Go, la administración automática de memoria, puede verse como un inconveniente, ya que la recolección de basura requiere una cierta cantidad de procesamiento. Por diseño, Go no proporciona administración de memoria manual y la recolección de basura en Go ha sido criticada por no manejar bien los tipos de cargas de memoria que aparecen en las aplicaciones empresariales. En el lado positivo, Go 1.8 trae muchas mejoras a la gestión de la memoria y la recolección de basura que reducen el tiempo de espera involucrado. Por supuesto, los desarrolladores de Go tienen la capacidad de usar la asignación de memoria manual en una extensión C, o mediante una biblioteca de administración de memoria manual de terceros.

La cultura del software en torno a la creación de GUI enriquecidas para aplicaciones Go, como las de las aplicaciones de escritorio, todavía está dispersa.

La mayoría de las aplicaciones de Go son herramientas de línea de comandos o servicios de red. Dicho esto, varios proyectos están trabajando para traer GUI enriquecidas para aplicaciones Go. Hay enlaces para los marcos GTK y GTK3. Otro proyecto está destinado a proporcionar interfaces de usuario nativas de la plataforma, aunque estas se basan en enlaces C y no están escritas en Go puro. Y los usuarios de Windows pueden probar a caminar. Pero no ha surgido un ganador claro o una apuesta segura a largo plazo en este espacio, y algunos proyectos, como el intento de Google de construir una biblioteca GUI multiplataforma, se han quedado en el camino. Además, debido a que Go es independiente de la plataforma por diseño, es poco probable que alguno de estos se convierta en parte del conjunto de paquetes estándar.

Aunque Go puede comunicarse con las funciones nativas del sistema, no fue diseñado para crear componentes de sistema de bajo nivel, como kernels o controladores de dispositivos, o sistemas integrados. Después de todo, el tiempo de ejecución de Go y el recolector de basura para las aplicaciones de Go dependen del sistema operativo subyacente. (Los desarrolladores interesados ​​en un lenguaje de vanguardia para ese tipo de trabajo pueden buscar en el lenguaje Rust).

Ir al futuro de los idiomas

La siguiente fase en el desarrollo de Go puede estar impulsada más por los deseos y necesidades de su base de desarrolladores, con los cuidadores de Go cambiando el lenguaje para adaptarse mejor a esta audiencia, en lugar de simplemente predicar con un ejemplo obstinado. En otras palabras, Go puede obtener las características que originalmente no estaban diseñadas para él, como los genéricos.

Está claro que los desarrolladores de Golang quieren estas cosas. La encuesta de usuarios de Go 2018 colocó a los genéricos entre los tres principales desafíos en el camino hacia una adopción más amplia de Go, junto con una mejor gestión de la dependencia y los paquetes. Y una propuesta existente en GitHub para genéricos permanece activa como propuesta para Go 2.x. Cambios como estos pueden ayudar a Go a ocupar un lugar más central en el desarrollo empresarial, donde actualmente reinan Java, JavaScript y Python.

Incluso sin cambios importantes, podemos esperar un mayor uso de Go para proyectos de reconstrucción de infraestructura, según los reemplazos de SSH y NTP descritos anteriormente, y como parte de proyectos en varios idiomas. 

También han proliferado las implementaciones de terceros de la cadena de herramientas Go. ActiveGo de ActiveState proporciona una edición con soporte comercial del lenguaje Go, y los proyectos LLVM y gccgo proporcionan implementaciones de código abierto con licencia liberal de Go a través de cadenas de herramientas alternativas.

Por último, Go también ha servido como base para desarrollar lenguajes completamente nuevos, aunque dos ejemplos de esto han dejado de desarrollarse activamente. Un ejemplo fue el lenguaje Have, que simplificó la sintaxis de Go, implementó algunos de los mismos conceptos a su manera y se transpiró a Go para una fácil ejecución. Otro proyecto desaparecido, Oden, utilizó el ensamblador y la cadena de herramientas de Go para compilar un lenguaje de nuevo diseño que se inspiró en lenguajes como Lisp y Haskell.

Este último conjunto de proyectos ilustra una de las formas en que cualquier innovación de TI se vuelve verdaderamente revolucionaria: cuando la gente la desarma y reutiliza, encontrando usos que sus diseñadores nunca pretendieron. El futuro del lenguaje Go como proyecto pirateable recién está comenzando. Pero su futuro como importante lenguaje de programación ya está asegurado, ciertamente en la nube, donde la velocidad y la simplicidad de Go facilitan el desarrollo de una infraestructura escalable que se pueda mantener a largo plazo.