En 2007 Google tenía un problema poco glamuroso para una de las compañías con mayor capacidad informática del mundo: algunos de sus grandes proyectos en C++ podían necesitar muchos minutos e incluso horas para compilar. Ken Thompson, creador de Unix y ganador del Premio Turing, Robert Griesemer y Rob Pike comenzaron entonces a diseñar un lenguaje que intentaba resolver parte de aquel problema eliminando complejidad. El resultado fue Go, presentado públicamente en 2009 y convertido después en una tecnología habitual detrás de herramientas como Docker, Kubernetes, Prometheus o Terraform.
Las claves del origen de Go en 20 segundos
- Robert Griesemer, Rob Pike y Ken Thompson comenzaron a diseñar Go en Google el 21/09/2007.
- Los largos tiempos de compilación de grandes proyectos fueron una de sus motivaciones reconocidas.
- Go priorizó compilaciones rápidas, herramientas integradas y un lenguaje deliberadamente pequeño.
- Su sencillez recibió críticas, especialmente por ausencias como los genéricos.
- Go 1.18 terminó incorporándolos en marzo de 2022.
La historia suele contarse como una rebelión contra C++, pero esa explicación necesita matices. Go no nació simplemente porque Thompson considerase malo otro lenguaje. Google estaba desarrollando sistemas con decenas de millones de líneas de código, cientos o miles de desarrolladores y enormes árboles de dependencias. Rob Pike explicó posteriormente que los tiempos de construcción podían alcanzar horas incluso utilizando grandes clústeres de compilación.
La documentación oficial de Go confirma que esperar la compilación de un gran servidor de Google estuvo realmente entre las motivaciones originales. El objetivo era crear un lenguaje mejor adaptado al software de gran tamaño que la compañía desarrollaba y operaba.
El problema que Go intentó resolver era desarrollar software a gran escala
La filosofía detrás de Go se entiende mejor mirando varias décadas atrás.
Ken Thompson había trabajado junto a Dennis Ritchie y otros investigadores de Bell Labs en Unix, un sistema cuya influencia terminó extendiéndose mucho más allá del Unix original. Linux no deriva directamente de su código, pero reproduce buena parte del modelo Unix; Android utiliza el kernel Linux y macOS pertenece a otra rama histórica, basada en Darwin y tecnologías procedentes de BSD, NeXT y Mach.
Por eso presentar a Thompson como «el padre de todos los sistemas operativos modernos» resulta atractivo, pero impreciso. Su influencia es enorme, aunque los árboles genealógicos son bastante más complejos.
Décadas después, Thompson volvió a encontrarse ante un problema conocido: cómo evitar que un sistema acumule tanta complejidad que termine dificultando su propio desarrollo.
El 21 de septiembre de 2007, Robert Griesemer, Rob Pike y Ken Thompson empezaron a esbozar en una pizarra los objetivos de un nuevo lenguaje, según recoge la propia documentación de Go.
El problema no era únicamente cuánto tardaba C++ en generar un binario.
Google trabajaba con programas enormes mantenidos simultáneamente por grandes equipos. En esas condiciones importaba cuánto tardaba en compilar el software, pero también cuánto costaba comprender código escrito por otra persona, analizar dependencias, incorporar desarrolladores o mantener herramientas internas.
Go intentó atacar varios de esos problemas desde el propio diseño del lenguaje.
En lugar de añadir continuamente mecanismos para cubrir todos los estilos posibles de programación, sus creadores optaron por restringir deliberadamente las posibilidades.
La idea tenía una consecuencia interesante para equipos de desarrollo: menos decisiones individuales podían significar mayor uniformidad colectiva.
Uno de los ejemplos más visibles continúa siendo gofmt.
En muchos lenguajes los equipos mantienen extensas guías sobre indentación, espacios, saltos de línea y colocación de determinadas construcciones. Go proporciona una herramienta oficial que normaliza automáticamente el formato.
La documentación oficial describe precisamente la automatización de tareas rutinarias, incluido el formateo, como uno de los objetivos generales del lenguaje.
Para un desarrollador individual puede parecer una cuestión menor. En un repositorio mantenido durante años por cientos de personas elimina una categoría completa de decisiones y discusiones.
De las críticas por sus ausencias al lenguaje de la infraestructura cloud
La simplicidad tuvo un precio.
Las primeras versiones de Go carecían de características habituales en otros lenguajes modernos. No tenía genéricos, por ejemplo, y tampoco adoptó el modelo tradicional de excepciones o las jerarquías de clases propias de Java y C++.
Aquellas decisiones provocaron críticas desde prácticamente el nacimiento público del proyecto.
Una conocida explicación de Rob Pike sobre los desarrolladores para los que Google necesitaba diseñar Go también terminó alimentando la imagen de que se trataba de un lenguaje deliberadamente simplificado para programadores menos experimentados. La interpretación popular derivó en etiquetas como «lenguaje para tontos», aunque reducir la posición de Pike a esa frase elimina buena parte del argumento original: Google necesitaba software que pudiera ser entendido y mantenido por equipos enormes durante largos periodos.
La apuesta empezó a encontrar un terreno especialmente adecuado unos años después.
La expansión de los contenedores, los sistemas distribuidos y la infraestructura cloud creó demanda para programas relativamente fáciles de compilar, distribuir y desplegar.
Go encajaba bien en ese escenario.
Docker fue desarrollado principalmente en Go. Kubernetes, liberado originalmente por Google en 2014, también eligió Go. A ellos se sumaron proyectos que terminarían formando parte del trabajo cotidiano de administradores de sistemas y equipos DevOps, como Prometheus y numerosos componentes del entorno cloud native.
Terraform, creado originalmente por HashiCorp, constituye otro ejemplo conocido del uso de Go en herramientas de infraestructura.
No existe una única característica que explique esa adopción.
Go combina compilación a código nativo, concurrencia integrada mediante goroutines y channels, recolección automática de memoria, una biblioteca estándar amplia y una cadena de herramientas estrechamente integrada.
También permite producir ejecutables cuya distribución puede resultar particularmente cómoda en muchos escenarios.
Para herramientas de infraestructura esto tiene consecuencias prácticas. Un proveedor puede entregar un ejecutable sin exigir que el administrador prepare previamente un entorno completo de ejecución equivalente al utilizado durante el desarrollo.
Go tampoco necesita un sistema externo de construcción para los casos habituales.
El proyecto explica que uno de sus objetivos iniciales era que el código pudiera compilarse utilizando la información presente en las propias fuentes, evitando la necesidad obligatoria de mantener Makefiles u otros sistemas equivalentes.
Esa combinación ayudó a que Go encontrara un espacio donde su aparente austeridad tenía ventajas operativas.
Go terminó aceptando los genéricos, pero no abandonó su filosofía
La historia tampoco terminó con un lenguaje congelado en las decisiones de 2009.
Durante años, una de las peticiones más repetidas por los desarrolladores fue incorporar programación genérica.
El equipo se resistió hasta encontrar un diseño que consideró compatible con el resto del lenguaje.
Finalmente Go 1.18 introdujo genéricos el 15 de marzo de 2022 mediante tipos parametrizados. El propio proyecto los describió como el mayor cambio realizado en el lenguaje desde su publicación inicial como software abierto.
La incorporación resulta interesante precisamente porque muestra que simplicidad no significa inmovilidad.
Go añadió una característica que había rechazado durante más de una década, pero continuó recomendando utilizarla únicamente cuando aportase algo concreto. Ian Lance Taylor resumió posteriormente esa filosofía aconsejando empezar escribiendo funciones normales y añadir parámetros de tipo cuando su utilidad resulte evidente, en lugar de diseñar el programa alrededor de abstracciones genéricas desde el principio.
Y el lenguaje sigue evolucionando.
La publicación oficial del proyecto del 26/08/2026 adelanta que Go 1.27 incorpora métodos genéricos, ampliando el modelo introducido inicialmente con Go 1.18.
Casi dos décadas después de aquella pizarra de Google, el resultado permite leer la historia de Go con bastante más perspectiva.
No «humilló» a C++, Java o cualquier otro lenguaje moderno. Todos siguen resolviendo problemas para los que Go puede no ser la opción adecuada.
Lo que sí demostró es algo especialmente relevante para administradores y desarrolladores: un lenguaje puede ganar adopción no por ofrecer más posibilidades, sino por reducir el número de decisiones necesarias para construir, leer, compilar y desplegar software.
El problema que Thompson, Pike y Griesemer intentaban resolver en 2007 tampoco era encontrar el lenguaje más sofisticado.
Era conseguir que grandes grupos de personas pudieran construir grandes sistemas sin que la complejidad del propio proceso terminara convirtiéndose en otro problema.
La posterior presencia de Go en Docker, Kubernetes y buena parte del software asociado a la infraestructura cloud convirtió aquella decisión de diseño en algo bastante más importante que una discusión entre lenguajes de programación.
Preguntas frecuentes
¿Por qué Google creó el lenguaje Go?
Los largos tiempos de compilación y la dificultad de trabajar con enormes bases de código estuvieron entre las motivaciones. Google necesitaba además herramientas adecuadas para sistemas mantenidos por grandes equipos y desplegados a gran escala.
¿Quién creó Go?
Robert Griesemer, Rob Pike y Ken Thompson comenzaron a definir el lenguaje en Google el 21/09/2007. Go se presentó públicamente en noviembre de 2009.
¿Por qué Go se utiliza tanto en herramientas cloud?
Su compilación nativa, modelo de concurrencia, herramientas integradas y facilidad para distribuir ejecutables encajan bien con servicios de red y herramientas de infraestructura. Kubernetes, Docker y Prometheus son algunos de sus ejemplos más conocidos.
¿Go tiene genéricos?
Sí. Go 1.18 incorporó genéricos en marzo de 2022, más de una década después de la publicación inicial del lenguaje. El diseño ha continuado evolucionando posteriormente.







