Qué me gusta de Go

goimg1910Siempre me ha gustado ver y probar diferentes tecnologías, y dentro de estas, como no, lenguajes de programación.

Ejemplo de esto fue el uso intensivo que di en su momento, en Arrakis, a Rebol , un lenguaje multiplataforma interpretado, con todo lo que podías necesitar para realizar geniales scripts de limpieza de datos, en una sintaxis “extraña”, pero bella en su planteamiento.

El caso de Go fue un poco diferente, porque al igual que me ocurrió con Angular, en su momento (hace varios años) traté de darle una oportunidad, pero toda la información y ejemplos que encontraba eran bloques de código “muy pequeño”, no veía en eso (a mirada de pájaro) que estuviese terminado, parecía un lenguaje más académico/conceptual que algo para su uso real.

Pasaron los años y cuando volví a verlo, los ejemplos eran los mismos, igual de pequeños, el código era igual de simple. ¿ Como puede ser esto ?, revisé algunos proyectos hechos en Go, y mi sorpresa fue que eran siempre así, no eran “snippets” de código lo que se podía ver, erá código real y completo.

Detectado el error de percepción por mi parte, manos a la obra con Go, en una tarde ya había hecho varias pruebas de concepto:

  • Un crawler usando la red Tor
  • Migrar varios scripts de tareas PHP-Beanstalk a Go
  • Cliente de ElasticSearch
  • Un transformador de documentos de MongoDB a documentos de ElasticSearch
  • Un transformador de Json (parser) a XML
  • Un transformador de MySQL a MongoDB

Cada una más sencilla que la anterior, y siempre conservando la sencillez.

Esa es la premisa de Go el código debe ser Simple, tan simple como el propio lenguaje, donde su definicion (Specs) es de 51 páginas frente, por ejemplo, las 781 páginas de Java.

En Go tenemos muchos elementos conocidos de otros lenguajes y otros completamente diferentes, un ejemplo es la “concurrencia”: Go está pensado para ejecutar procesos “concurrentes”, las Gorutines, y cuando las vemos por primera vez pensamos en Threads. En Go no existen los Threads (desde el punto de vista del lenguaje), sino procesos independientes y concurrentes, que tampoco significa que se ejecuten en paralelo (parece contradictorio pero es el módo Go de llamar a las cosas). En Go puedes ejecutar algo en un “proceso independiente” y, puede que se ejecute en paralelo a otros procesos, todo dependerá de los procesadores asignados, pero se ejecutará sin parar el proceso actual (hilo de ejecución). Suena raro, pero es ejecución independiente (concurrente si se puede).

Las críticas y comparaciones se basan en unas premisas erroneas: Comparar peras con manzanas, no es que no sea comparable, sino que el que es y para lo que es, es simple, y lo que algunos pueden considerar “limitaciones” son características del lenguaje. Ejemplos:

Go no es 100% OOP:

¿ Por que debería serlo ? En Go si hay “clases” (Structs) y “objectos” (instancias de), y tienen métodos (funciones asociadas), y pueden implementar interfaces. Todo lo hace de una forma diferentes, ni mejor ni peor, diferente, y sabiéndolo no es un problema a la hora de utilizarlo, es solamente una característica a tener en cuenta.

No hay constructores, porque no se necesitan.

Interfaces, no se declaran en la definición de la clase, se definen externamente, y si la clase lo cumple, implementa el interface. En gran medida aquí, a la hora de desarrollar entramos en la pregunta: “Que va antes el interface/huevo o la clase/gallina”

Herencia: Existe pero es “particular”, y quizás un poco oscura para mi gusto.

Polimorfismo: Rotundamente no, ya que go es static typed, aunque se puede emular.

Namespaces: Son simples, y si, puede haber “conflicto” de nombres de tus packages y otros, pero se pueden utilizar alias, pero … y esta es la parte interesante de Go, como el código debes  (por convenio) dividirlo en paquetes con funciones organizadas por “su función” y deben ser pequeños, es dificil que necesites utilizar en cada uno muchos paquetes que tengan ese conflicto de nombres.

Visiblidad de las propiedades de una clase: Siendo Go tan simple, se han cargado de un plumazo el definir en el lenguaje si una propiedad es pública, privada, …en Go, si una propiedad empieza por mayúscula se “exporta” (es pública) sino es solo visible en el objeto, lo mismo se aplica para métodos y funciones dentro de una paquete.

Excepciones: En Go no hay excepciones, ni como concepto, ni como elemento de control de ejecución, es mas … no hay “errores” en Go (en la definición del lenguaje), se elimina así mucha necesidad de proceso y memoria a la hora de controlar la ejecución (optimización). Está en tu mano definir, cuando se ejecuta algo, que debe “devolver” cuando ocurra algo “no esperado” y actuar en consideración.

Como Go es un lenguaje compilado, y ademas es multiplataforma (y permite generar el binario para otra plataforma: Windows, OSX, FreeBSD, Linux x86,Linux 64, Linux Arm … ) nos da plena libertad y facilidad a la hora de hacer las pruebas y deployment (no hay requisitos previos) en el binario va enlazado estáticamente todo lo que necesita.

Es simplemente sencillo y rápido compilar en OSX el binario para mi Raspberry PI 2,  subirlo y ejecutarlo.

 

Se que este “ladrillo” de texto está poco ordenado, pero simplemente lo he escrito como considero que lo habría dicho de viva voz, me faltan muchas cosas, y otras quizás sobren, aquí si que me falta la sencillez y concrección de Go 😉

comments powered by Disqus