Es un lenguaje de programación concurrente y compilado inspirado en la sintaxis de C, que intenta ser dinámica como python y con el performance de C o C++. Ha sido desarrollado por Google, y sus diseñadores iniciales fueron Robert Griesemer, Rob Pike y Ken Thompson. Actualmente está disponible en formato binario para los sistemas operativos windows GNU/Linux, FreeBSD y Mac os x.

Lo inventó un grupo de ingenieros de Google en 2007, porque ya estaban cansados de lo complicado que se estaba volviendo programar para los servidores, especialmente en C++. En 2009 lo hacen open source y en 2012 ya lanzan la versión 1.0. Nace con la idea de dame algo sencillo. Go tiene una sintaxis similar a C, solo que es más simplificada con ciertos cambios. Se compila directo a código nativo. Es pensado para concurrencia y tiene herramientas para muchas cosas; Go por ejemplo ya trae herramientas para dar formato a al código siguiendo los lineamientos de la comunidad.

Compilación rápida, es así primeramente porque lo diseñaron para que fuera rápido, pero también Go tiene ciertos paradigmas de programacion, cosas que nos obligan a hacer, que hacen que la compilación sea mas rapida. Uno de estos es que si uno declara una variable la tiene que usar, si no la usa Go genera un error. También las importaciones que uno haga se tienen que usar si no también va a ser un error para Go.

Dropbox ya está emigrando ciertos componentes críticos de python a Go.  Google tiene bastante de sus proyectos nuevos en Go. Heroku tiene ahora parte de su infraestructura en Go. Netflix tiene dos de sus arquitecturas de servidores en GO. Y Twitch.tv también está emigrando su chat de python a Go.

Go es un lenguaje de programación relativamente nuevo que va subir en popularidad, porque está pensado para concurrencia, paralelismo y ahora cada vez vemos más computación en la nube  paralelizada y/o concurrente. Aparte tiene grandes cosas que si bien es cierto son basadas en C, son conceptos más modernos que a eso se va apostando. Siento que por eso Go va a seguir ganando popularidad y soporte.

Tenemos la simplicidad. La sintaxis de Go es una versión simplificada de la sintaxis que tenemos en C o C++, pero al mismo tiempo agrega ciertas palabras clave al lenguaje para simplificar otras cosas. Un ejemplo de esto es la concurrencia. En otros lenguajes puede resultar tediosa la creación de hilos, subprocesos o procesos paralelos ya que se deben integrar varias librerías para lograrlo y después se deben manejar los problemas de concurrencia que estos puedan generar. Go nos da go routines, las cuales son similares a los hilos pero tienen más ventajas.

Un aspecto importante de Go es su garbage collector. Lo que lo hace maravilloso es su concurrencia. Usa mark and sweep de tres colores: negro, gris y blanco. Maneja la idea de un invariante. Si uno está en la zona negra no se puede apuntar a algún objeto o alguna cosa que esté en la zona blanca. Para hacer el proceso más rápido, Go hizo fue maneja situaciones específicas. Una de estas es que se crea un objeto y se apunta a él con el programa. Entonces lo que Go va hacer es meter el objeto dentro de su zona gris para lidiar con eso directamente o también si viene el programa y apunta algo que está en la zona blanca también va a mover esa cosa dentro de su zona gris para permitir que esto pueda ser apuntado.

La fase de marcado puede generar problemas. El problema principal al momento de hacerlo concurrente es que puede que alguna de las Go Routines que están trabajando no esté en un momento donde sea seguro para limpiar la memoria entonces tiene que hacer una etapa donde espera que todas las Go Routines estén en un llamado de función. Al momento que esto suceda va a hacer la fase de barrido y  marcado. El hecho de que están pendiente con eso de tres colores, de que nunca se esté apuntando a algo a lo que no debería de estar apuntando a algo a lo que nunca vas a llegar, le da mayor velocidad al garbage collector.

Regresando a las go routines, nos debemos preguntar: ¿Cómo nos vamos a comunicar entre ellas ?  Para esto son los canales. Uno simplemente le dice a la función: vas a escribir en este canal y uno va leyendo ese canal. Existen también los buffer channels. Estos los usamos cuando queremos que después de cierta cantidad de bytes se lea el canal.

Go no tiene herencia, no tiene jerarquía, lo que ellos usan son structs (una colección de variables de distintos valores), tiene funciones de primer orden y tiene las palabras claves como:

Defer es para que siempre se ejecute al final. Por ejemplo yo tengo un defer que imprime adiós y yo tengo un error dentro de mi programa por x o y razón. Ese defer siempre se va a correr al final del programa no importa que haya un error o algo. En cuanto termine la función ese difer se va a ejecutar.

Panic es para terminar inmediatamente la ejecución del programa. Aunque uno haga panic y tiene un defer arriba el difer siempre se va ejecutar,

Recovery nos sirve para manejar los panic, digamos que yo ejecuto un panic en cierto lado y yo en otro lado pongo recovery. En lugar de terminar la ejecución yo puedo manejar ese recovery y hacer lo que yo quiero con el mensaje o el error que tiró el panic.

¿Será complicado pasar de uno programando por objetos a un Go por comportamiento?

No si ya tenés la idea de que son los structs. Go hace sencillo darle ese comportamiento similar a un objeto por medio de las diferentes herramientas que brinda.