¿Qué es Go y cuándo conviene utilizarlo?
Autor: Redacción Domeny.ForSale Publicado
En pocas palabras: Go es un lenguaje de programación de propósito general, creado en Google y desarrollado como proyecto de código abierto. Se utiliza principalmente para crear servicios de servidor, herramientas que se ejecutan desde la terminal y software de infraestructura. Combina una sintaxis relativamente sencilla, compilación a código máquina y mecanismos integrados de concurrencia, es decir, de organización de múltiples tareas cuya ejecución puede solaparse en el tiempo.
¿En qué se diferencia Go de otros lenguajes?
El nombre oficial del lenguaje es Go, aunque en buscadores y conversaciones también encontrarás el término «Golang». No se refiere a otra versión ni a una tecnología distinta. Go tampoco tiene relación con el juego de mesa del mismo nombre.
Go es un lenguaje de tipado estático: los tipos de datos se comprueban durante la compilación, antes de ejecutar el programa. El compilador transforma el código fuente en un programa destinado al sistema operativo y la arquitectura de procesador elegidos. También permite detectar pronto algunos errores, como intentar utilizar texto donde se necesita un número.
El lenguaje recupera automáticamente la memoria que el programa ya no necesita. De ello se encarga un mecanismo llamado recolector de basura. El programador no tiene que liberar manualmente cada área de memoria, pero debe seguir controlando el consumo de recursos y cerrando los archivos o las conexiones.
Go tiene un número deliberadamente limitado de construcciones del lenguaje. No ofrece la herencia clásica de clases propia de Java; para organizar datos y comportamientos utiliza, entre otros recursos, estructuras e interfaces. Los errores suelen devolverse como valores que el código que realiza la llamada debe comprobar explícitamente.
¿Para qué se utiliza Go?
Go resulta adecuado para programas que realizan operaciones de red, procesan solicitudes y conectan distintos sistemas. Su biblioteca estándar incluye, entre otras funciones, soporte para HTTP, JSON, archivos y pruebas, por lo que muchas tareas básicas pueden resolverse sin un conjunto extenso de componentes adicionales.
Sus usos habituales son:
- Servicios backend y API: programas que se ejecutan en el servidor y proporcionan datos a una aplicación web o móvil.
- Herramientas de terminal: por ejemplo, un programa para hacer copias de seguridad, comprobar configuraciones o automatizar despliegues.
- Software de infraestructura: herramientas para gestionar contenedores, redes y entornos en la nube. Entre los proyectos conocidos que utilizan Go están Kubernetes y Prometheus.
- Servicios que procesan tareas en segundo plano: por ejemplo, reciben mensajes de una cola y guardan los resultados en una base de datos.
Por ejemplo, una tienda en línea puede tener un servicio independiente en Go que consulte el estado de un envío a varios transportistas y proporcione una respuesta uniforme al panel del cliente. Go es una opción razonable en este caso por sus herramientas de red y su soporte para operaciones concurrentes. Sin embargo, el lenguaje por sí solo no resolverá los problemas derivados de los límites de las API externas, los fallos o los errores en la lógica de los pedidos.
¿Cómo funciona la concurrencia en Go?
El mecanismo básico de concurrencia de Go son las goroutines: tareas ligeras gestionadas por el entorno de ejecución del lenguaje. Iniciar una función anteponiendo la palabra go permite ejecutarla de forma concurrente con otras tareas. Una goroutine no es un hilo independiente del sistema operativo; el entorno de Go planifica la ejecución de las goroutines sobre los hilos.
Para la comunicación entre tareas pueden utilizarse canales, un mecanismo que permite transmitir valores y sincronizar el trabajo. También existen bloqueos para proteger los datos compartidos. El uso de goroutines no elimina automáticamente el riesgo de interbloqueos ni de acceso simultáneo e inseguro a la memoria.
Supongamos que un programa debe comprobar la disponibilidad de diez sitios web. Con un enfoque secuencial, espera la respuesta de un sitio antes de consultar el siguiente. Con un enfoque concurrente, puede iniciar varias comprobaciones y esperar sus resultados al mismo tiempo, con un límite de conexiones y un tiempo de espera definidos.
La concurrencia no es lo mismo que el paralelismo. La primera se refiere a la organización de las tareas; el segundo, a su ejecución efectiva al mismo tiempo, por ejemplo, en varios núcleos del procesador. Tener más goroutines no garantiza un programa más rápido: el factor limitante puede ser la base de datos, el ancho de banda de la red o el coste de la sincronización.
¿Cuándo elegir Go y cuándo otro lenguaje?
Go es una opción razonable si estás creando un servicio de red independiente o una herramienta que deba ser fácil de ejecutar en servidores. A menudo se puede distribuir un único archivo ejecutable sin instalar un intérprete aparte. No es una regla absoluta: el uso de bibliotecas de C o de archivos externos puede introducir dependencias adicionales.
Elegir otro lenguaje puede resultar más práctico en las siguientes situaciones:
- Análisis de datos y aprendizaje automático: Python suele ofrecer un acceso más cómodo a las bibliotecas y herramientas utilizadas en estos ámbitos.
- Interfaces que funcionan en el navegador: JavaScript o TypeScript son las opciones habituales para trabajar directamente con la interfaz de una página web.
- Desarrollo de una aplicación existente en Java: mantener el entorno actual puede ser más conveniente que incorporar otro lenguaje que también habrá que mantener.
- Control estricto de la memoria y la latencia: Rust o C++ pueden ajustarse mejor a requisitos que dificultan el uso de un recolector de basura.
Son orientaciones, no una clasificación de la calidad de los lenguajes. Al elegir, ten en cuenta las bibliotecas disponibles, la experiencia del equipo y los requisitos del programa concreto.
¿Cómo empezar a aprender Go?
Instala la versión estable actual siguiendo las instrucciones del sitio oficial del proyecto Go y comprueba los requisitos de tu sistema. A continuación, verifica la instalación con el comando go version y crea un directorio para tu primer proyecto.
Guarda en él el archivo main.go:
package main
import "fmt"
func main() {
fmt.Println("¡Hola, Go!")
}
En la terminal, ejecuta go mod init ejemplo/hola para crear un módulo, es decir, una unidad para organizar el proyecto y gestionar sus dependencias. El comando go run . compilará y ejecutará el programa, mientras que go build . creará un archivo ejecutable. go fmt ./... se encarga de dar formato al código, y las pruebas se ejecutan con go test ./....
Como siguiente ejercicio, crea un programa que compruebe el estado HTTP de un sitio web. Añade gestión de errores y un tiempo límite, y solo después amplíalo para comprobar varias direcciones de forma concurrente.
Consulta también: ¿Qué es 2FA?
