En la mayoría de los ecosistemas de programación, tu flujo de trabajo es un rompecabezas de herramientas externas: necesitas un compilador, un gestor de paquetes, un linter, un formateador de código y un ejecutor de tests, casi todos instalados por separado. En Go, esto no existe. El comando go es un toolchain unificado: una única herramienta que orquesta absolutamente todo el ciclo de vida del software.
Esto funciona así porque el diseño de Go prioriza la consistencia y la simplicidad operativa; al integrar el gestor de dependencias, el formateador y el compilador en un solo binario, se elimina la “guerra de herramientas” y se garantiza que todos los desarrolladores de un proyecto usen exactamente las mismas reglas. Utilizarás este comando para todo: desde la primera línea de código hasta el despliegue en producción. Si intentas usar herramientas externas para formatear o gestionar paquetes en Go, estarás luchando contra la naturaleza del lenguaje y complicando innecesariamente tu proceso de CI/CD. Si lo usas mal, como intentar gestionar dependencias de forma manual sin go mod, romperás la reproducibilidad de tus builds y tu proyecto se volverá inmanejable al escalar.
package main
import (
"fmt"
"os"
)
// Suma realiza la suma de dos enteros.
func Suma(a, b int) int {
return a + b
}
func main() {
// Ejemplo de uso de una función
resultado := Suma(10, 5)
fmt.Printf("El resultado es: %d\n", resultado)
// Ejemplo de un error potencial para que lo veas con go vet
if os.Args == nil {
fmt.Println("No hay argumentos")
}
// Un pequeño error de lógica que go vet podría detectar
// en otros contextos de tipos
_ = Suma(1, 2)
}
Cuando ejecutas go run main.go, el toolchain hace algo muy inteligente: compila tu código en un directorio temporal y lo ejecuta inmediatamente, sin dejar basura en tu carpeta de proyecto. Es ideal para pruebas rápidas. Si lo que quieres es preparar el programa para entregarlo a un cliente o subirlo a un servidor, usas go build, que genera un binario estático: un archivo ejecutable que contiene todo lo necesario para correr, sin necesidad de que el servidor tenga Go instalado. Si quieres que ese programa esté disponible en tu terminal como cualquier otro comando del sistema (como ls o cd), usas go install, que lo compila y lo mueve a tu carpeta de binarios de Go.
Para mantener la calidad del código, Go te impone reglas. Si tu código tiene espacios de más o tabs mal puestos, go fmt lo arreglará automáticamente siguiendo el estándar oficial; en Go, no se discute sobre el estilo, se usa go fmt y listo. Para encontrar errores que el compilador no ve (como variables que nunca se usan o errores de tipo sutiles), usas go vet, que es un linter estático integrado. Si el proyecto crece y empiezas a usar librerías de otros, go mod init crea tu archivo de módulo y go mod tidy se encarga de limpiar y sincronizar todas tus dependencias, asegurando que tu archivo go.mod sea siempre la fuente de verdad.
El error frecuente
Un error clásico de principiante es confundir el uso de go run con go build en entornos de producción.
# ERROR: Nunca hagas esto en un servidor de producción go run main.go
Usar go run en producción es un error porque el comando tiene que compilar el código cada vez que se ejecuta, lo que consume recursos innecesarios y hace que el inicio de la aplicación sea lento. Además, dependes de que el entorno de ejecución tenga instalado todo el toolchain de Go. En producción, siempre debes usar el binario generado por go build para garantizar que lo que probaste en tu máquina sea exactamente lo mismo que se está ejecutando en el servidor.
Para gestionar el entorno, go env te permite ver todas las variables de configuración (como dónde se guardan tus paquetes o qué versión de Go tienes), y go clean es tu herramienta de limpieza cuando necesitas borrar archivos temporales o de compilación antiguos para empezar de cero.
N° 9