Cuando escribes código en Go, estás redactando archivos de texto con instrucciones que el procesador de tu computadora no entiende directamente. El proceso de transformar ese código fuente en algo que el sistema operativo pueda ejecutar se llama compilación. En Go, este proceso es extremadamente eficiente porque el compilador traduce tu código directamente a lenguaje máquina. Para organizar tu proyecto y gestionar sus dependencias, primero debes inicializar un módulo mediante el comando go mod init. El corazón de cualquier programa ejecutable en Go debe residir en un archivo que declare package main y contenga una función llamada func main(); este es el punto de entrada exacto donde el sistema operativo entrega el control a tu programa.
Usarás este flujo de trabajo cada vez que inicies un proyecto nuevo o quieras probar un cambio rápido. Si olvidas declarar package main, el compilador pensará que estás escribiendo una librería y no un programa ejecutable, por lo que no generará un binario. Si omites la función main, el enlazador (linker) fallará al no encontrar dónde comienza la ejecución.
package main
import (
"fmt"
"runtime"
)
func main() {
// Imprimimos un mensaje de bienvenida y metadatos del sistema
fmt.Println("¡Hola, Go! Ejecución completada con éxito.")
// Mostramos la arquitectura y el sistema operativo para el cual se compiló
fmt.Printf("Arquitectura: %s\n", runtime.GOARCH)
fmt.Printf("Sistema operativo: %s\n", runtime.GOOS)
}
Para probar este código, primero debes preparar tu entorno en una carpeta limpia. Ejecuta go mod init mi-proyecto para crear el archivo go.mod. Luego, guarda el código anterior en un archivo llamado main.go.
Si utilizas go run main.go, Go realizará una compilación rápida en un directorio temporal y ejecutará el programa de inmediato; es ideal para el desarrollo porque no ensucia tu carpeta con archivos adicionales, pero el binario desaparece al terminar. Por el contrario, si usas go build, el compilador generará un archivo binario ejecutable en tu directorio actual.
Al revisar ese binario con el comando file, verás que es un ejecutable de tipo ELF (en Linux) o Mach-O (en macOS). Si lo inspeccionas con ldd en Linux, notarás que tiene muy pocas dependencias externas; esto sucede porque Go utiliza mayoritariamente static linking (enlace estático), integrando la mayoría de las librerías necesarias dentro del propio binario. Esto te permite copiar el archivo a otro equipo con la misma arquitectura y que funcione sin instalar nada más, eliminando la necesidad de usar Makefiles complejos o gestionar dependencias de librerías del sistema para programas sencillos.
La portabilidad de estos binarios es la razón por la cual Go es el estándar de facto en la infraestructura de contenedores y sistemas distribuidos modernos.
N° 11