Go es un lenguaje de programación compilado y de tipado estático creado en Google. Produce un único binario nativo, compila en segundos, tiene recolección de basura y trae la concurrencia integrada en el lenguaje mediante goroutines y channels. Su terreno principal es el software de servidor: APIs, servicios de red y las herramientas de línea de comandos y de la nube que los hacen funcionar.
Aquí tienes un programa Go completo. Pulsa Run.
Todo programa Go empieza en package main, en func main(). := declara una variable e infiere su tipo (aquí []string, un slice de strings). range recorre el slice y te da un índice y un valor. fmt y strings vienen de la librería estándar, que es lo bastante amplia como para que muchos programas no importen nada más.
Go frente a Golang: el nombre
El lenguaje se llama Go. "Golang" es un apodo que viene del primer sitio web del proyecto, golang.org (ahora el sitio está en go.dev). La gente lo siguió usando porque buscar "go" en la web devuelve de todo menos el lenguaje. La documentación oficial dice "Go", pero "golang" es el término que casi todo el mundo escribe en un buscador, y los dos significan lo mismo. No existe un producto ni un dialecto "Golang" aparte.
Quién creó Go y por qué
Robert Griesemer, Rob Pike y Ken Thompson empezaron a diseñar Go en Google en 2007. Se publicó como código abierto en noviembre de 2009, y Go 1.0 salió en marzo de 2012.
La motivación fue práctica. Las grandes bases de código en C++ y Java de Google tardaban mucho en compilar, los grafos de dependencias eran difíciles de gestionar, y las máquinas multinúcleo y los servicios en red eran lo normal, pero escribir código concurrente era propenso a errores. El diseño de Go responde directamente a esos problemas:
- Compilación rápida. Los imports son explícitos, un import sin usar es un error de compilación y el compilador no vuelve a analizar cabeceras, así que los programas grandes compilan en segundos.
- Un lenguaje sencillo. Pocas palabras clave, un solo bucle (
for), sin herencia, sin excepciones. El código escrito por personas distintas tiende a parecerse, lo que ayuda en las revisiones de un equipo grande. - La concurrencia como característica del lenguaje. Lanzar una tarea concurrente es una palabra clave,
go, y los channels permiten que las tareas se comuniquen. - Despliegue sencillo. El resultado es un binario que copias a un servidor. Normalmente está enlazado de forma estática; con cgo activado, paquetes como
netpueden enlazarse con la librería C del sistema, yCGO_ENABLED=0lo desactiva.
Go 1.0 llegó también con la promesa de compatibilidad de Go 1: los programas escritos para Go 1.0 siguen compilando y ejecutándose con las versiones 1.x posteriores. En la práctica, actualizar la toolchain rara vez rompe tu código, y es una de las grandes razones por las que los equipos confían en Go para servicios de larga vida.
Para qué se usa Golang
Go brilla donde un programa habla con una red, se ejecuta durante mucho tiempo y tiene que ser fácil de distribuir:
| Área | Ejemplos |
|---|---|
| APIs web y microservicios | servicios HTTP y gRPC, backends de apps web y móviles |
| Herramientas de nube e infraestructura | Docker, Kubernetes, Terraform, Prometheus |
| Herramientas de línea de comandos | CLIs para desarrolladores que se distribuyen como un único binario por plataforma |
| Redes | proxies, balanceadores de carga, servidores DNS |
| Pipelines de datos | workers que leen colas, transforman registros y escriben en bases de datos |
Encaja peor en apps de escritorio con interfaz gráfica, apps móviles, front ends de navegador y trabajo numérico o de machine learning, donde otros ecosistemas tienen librerías mucho mejores.
Características clave, con código
Tipos estáticos con inferencia
Cada variable tiene un tipo fijado en tiempo de compilación, pero rara vez lo escribes. := lo infiere:
Go nunca convierte entre tipos numéricos en silencio. count * price no compila, porque uno es int y el otro float64; escribes tú float64(count). Eso descarta los bugs silenciosos de truncado y de precisión.
Los errores son valores
Go no tiene excepciones. Una función que puede fallar devuelve un error como último resultado, y quien la llama lo comprueba:
El patrón if err != nil es la línea más reconocible del código Go. Es verboso, y esa es la idea: cada sitio donde un programa puede fallar se ve allí donde ocurre. Consulta manejo de errores para envolver e inspeccionar errores.
Goroutines y channels
Una goroutine es una función que se ejecuta de forma concurrente con el resto del programa. Cuesta unos pocos kilobytes de pila, así que ejecutar miles es normal. Los channels pasan valores entre goroutines de forma segura:
Las tres goroutines se ejecutan de forma concurrente, así que las tres líneas pueden imprimirse en cualquier orden. Ejecútalo varias veces y puede que veas órdenes distintos. main recibe exactamente tres valores, así que espera a todos antes de terminar.
Interfaces sin "implements"
Un tipo cumple una interfaz simplemente por tener los métodos adecuados. No existe la palabra clave implements:
Rect y Circle nunca mencionan Shape, y aun así los dos pueden guardarse en un []Shape. Esto te permite definir una interfaz en el paquete que la usa, mucho después de que se escribieran los tipos concretos.
Una sola toolchain
El comando go lo hace todo: go run compila y ejecuta, go build crea un binario, go test ejecuta los tests, go fmt formatea el código, go vet detecta construcciones sospechosas y go mod gestiona las dependencias. Hay un único estilo de formato oficial, impuesto por gofmt, así que en los proyectos Go nadie discute sobre llaves ni sangrías.
Lo que Go deja fuera a propósito
Algunas características habituales en otros lenguajes faltan a propósito:
- Sin clases ni herencia. Usas structs, métodos, interfaces y embedding.
- Sin excepciones. Los errores son valores devueltos.
panicexiste, pero es para bugs, no para fallos normales. - Sin operador ternario. Escribes un
if/else. - Sin la palabra clave
while.forcubre todos los bucles. - Sin sobrecarga de funciones ni argumentos por defecto.
- Genéricos solo desde Go 1.18, y deliberadamente limitados en comparación con las plantillas de C++ o los genéricos de Java.
Contrapartidas, sin rodeos
Verbosidad. Las comprobaciones explícitas de errores y la falta de atajos como el operador ternario hacen que el código Go sea más largo que su equivalente en Python o Kotlin. Leerlo es fácil; escribirlo lleva más líneas.
Recolección de basura. El recolector de Go tiene pausas cortas, pero sigue siendo un recolector de basura. Para sistemas de tiempo real estricto o código donde importa cada reserva de memoria, C, C++ o Rust te dan más control.
Valores nil. Go tiene punteros, maps, slices e interfaces nil. Desreferenciar un puntero nil es un panic en tiempo de ejecución, y el compilador no lo impide como hace el sistema de tipos de Rust.
Un sistema de tipos pequeño. Sin tipos suma, sin enums (los construyes con constantes e iota) y con unos genéricos que cubren los casos habituales pero no la programación avanzada a nivel de tipos.
Huecos en el ecosistema. Las librerías para servicios web, bases de datos y APIs de la nube son excelentes. Para interfaces gráficas, computación científica y machine learning, Python, C++ o Julia tienen mucho más.
Go comparado con otros lenguajes
| Go | Python | Java | Rust | |
|---|---|---|---|---|
| Tipado | Estático | Dinámico | Estático | Estático |
| Se ejecuta como | Binario nativo | Intérprete | Bytecode de la JVM | Binario nativo |
| Memoria | Recolección de basura | Recolección de basura | Recolección de basura | Ownership, sin GC |
| Concurrencia | Goroutines, channels | Hilos, asyncio (el GIL limita el paralelismo de CPU) | Hilos, hilos virtuales | Hilos, async |
| Curva de aprendizaje | Baja | Baja | Media | Alta |
Elige Go cuando quieras el rendimiento de un lenguaje compilado y un despliegue sencillo sin la curva de aprendizaje de Rust ni la ceremonia de Java.
¿Merece la pena aprender Go?
Si escribes servicios de backend, herramientas de línea de comandos o cualquier cosa del mundo de la infraestructura en la nube, sí. Buena parte de ese ecosistema está escrita en Go, y leer su código fuente forma parte del trabajo. El lenguaje es pequeño, así que la inversión es modesta: la sintaxis básica lleva días, y la concurrencia y el manejo de errores idiomáticos, unas semanas de práctica.
Para empezar a escribir Go en local, instala Go y luego sigue la página de hola mundo, que explica cada línea de un primer programa.
Preguntas frecuentes
¿Para qué se usa Golang?
Sobre todo para software de backend e infraestructura: servidores web y APIs, microservicios, herramientas de línea de comandos, código de red y herramientas para la nube. Docker, Kubernetes, Terraform y Prometheus están escritos en Go. Rara vez se usa para interfaces gráficas de escritorio, apps móviles o ciencia de datos.
¿Go y Golang son lo mismo?
Sí. El nombre del lenguaje es Go. "Golang" viene de la dirección del sitio web original, golang.org, y se quedó porque "go" es una palabra difícil de buscar. Los dos nombres se refieren al mismo lenguaje y a la misma toolchain.
¿Quién creó el lenguaje de programación Go?
Robert Griesemer, Rob Pike y Ken Thompson diseñaron Go en Google a partir de 2007. Se anunció como código abierto en noviembre de 2009, y Go 1.0, la versión con la que empezó la promesa de compatibilidad de Go, salió en marzo de 2012.
¿Es fácil aprender Go?
El lenguaje en sí es pequeño: 25 palabras clave, una sola construcción de bucle y una especificación corta que se lee en una tarde. La mayoría de programadores con experiencia en otro lenguaje escriben Go que funciona en cuestión de días. Lo que lleva más tiempo son los idiomas: el manejo explícito de errores, las interfaces y escribir código concurrente correcto con goroutines y channels.
¿Go es compilado o interpretado?
Compilado. go build produce un binario nativo en código máquina sin depender de un intérprete ni de una máquina virtual. go run también compila; simplemente compila en una ubicación temporal y ejecuta el resultado.