Introducción a Golang

El lenguaje de programación Go, también conocido como Golang, fue diseñado en 2007 (y su primera versión lanzada en 2012) en Google con el objetivo de mejorar la productividad y eficiencia del desarrollo en backend. Los creadores de Go estaban motivados por problemas recurrentes encontrados en su uso de C++ para dicho desarrollo. Por lo tanto, las metas principales de Golang como lenguaje son:

  • Tipado estático y eficiencia en tiempo de ejecución (como C++).
  • Legibilidad y usabilidad (como lenguajes más modernos, como Python o Javascript). Un concepto de usabilidad fuertemente adoptado por Go es la el manejo automático de dependencias, como NodeJS lo hace vía Node Package Manager (npm). Golang usa el comando `go get` para ello.
  • Alto desempeño en networking y multiprocesamiento: Se busca aprovechar al máximo las arquitecturas multiprocesador, favoreciendo el escalado horizontal (mejorar agregando máquinas).

El gopher (ardilla terrestre) azul es la mascota de Go

package main

import "fmt"

func main() {
    fmt.Println("hello world")
}

Luego de instalar Go, se puede compilar con go build your_file.go, y ejecutar con go run your_go. ¡Simple!

Golang tiene una sintaxis similar a C, con punteros, pero también recolección de basura (que puede ser ajustada y desactivada). También deja de lado las clases y herencia, reemplazándolas con structs y type embedding (lo cual es más cercano al uso de composición para reusar código). Un struct puede tener funciones asociadas, así como una clase en otros lenguajes tiene métodos; sin embargo, no hay herencia ni mecanismos de override. Un struct sí puede implementar una interfaz, pero no necesita declararlo explícitamente? con definir funciones que cumplan la interfaz es suficiente.

Otro concepto típico de POO que Go abandona son las excepciones; en su lugar, se devuelve una instancia de error. Una función puede tener múltiples valores de retorno, por lo tanto no es necesario devolver datos usando los argumentos.

Tampoco hay generics en Go; lo más cercano es interface{}, que sería similar a la clase System.Object de Java, u object de C#: un tipo base detrás del cual puede haber cualquier tipo concreto. Para ayudar a conocer el tipo concreto dinámicamente, hay funciones de reflection.

Los mecanismos de concurrencia son ciudadanos de primera clase en Go: los threads livianos son llamados "goroutines", y pueden comunicarse entre sí usando "channels", los cuales pueden ser vistos como colas de mensajes bloqueantes bidireccionales. Cuando una goroutine envía datos por un channel, quedará bloqueada hasta que otra goroutine lea ese dato de ese channel (éste es el comportamiento por defecto, el cual se denomina unbuffered; se puede definir un backlog, o cantidad de mensajes a acumular para reducir el bloqueo). Sólo con goroutines y channels, muchos patrones de concurrencia son posibles de entrada. Por supuesto, si hay concurrencia, puede surgir la necesidad de la exclusión mutua, para lo cual existen funciones también.

Un buen lugar para comenzar es el tour oficial. Para un abordaje más intenso, está Effective Go. Para información más específica y al día, está el blog oficial. Así como C++ tiene a Bjarne Stroustrup, Go tiene a Rob Pike. Otra muy buena fuente de material son los videos de GopherCon del canal Gopher Academy channel (aprendí sobre memory profiling allí).

Este tipo (Rob Pike) sabe un par de cosas

¡Manténganse sintonizados para posts más detallados sobre Go!

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x