Cómo funciona Go (Golang): Compilación, concurrencia, memoria y runtime

Go (Golang) es un lenguaje compilado tipado estáticamente diseñado en Google (2007, de código abierto 2009) por Robert Griesemer, Rob Pike, Ken Thompson. No es "Gopher" — ese es la mascota.

1. Canalización de compilación

.go source → go build → SSA IR → Machine Code (ELF/Mach-O/PE) → Static Binary 
  • Sin VM, sin intérprete. Binario único = implementación fácil.
  • Compilación rápida: ~1M líneas/seg (Go 1.22+).
  • Compilación cruzada: `GOOS=linux GOARCH=amd64 go build` — sin instalar toolchain en el objetivo.

2. Sistema de tipos

  • Estático, estructural (interfaces satisfechas implícitamente), sin herencia.
  • Genéricos (desde 1.18): parámetros de tipo, restricciones.
  • Valores cero: `var x int` → 0; `var s string` → ""; `var p *T` → nil.

3. Gestión de memoria

  • Análisis de escape (tiempo de compilación): decide asignación heap vs pila.
  • Recolector de basura: Concurrente, marca-barrido tricolor, no generacional, baja latencia (<1 ms típico). Ajustable `GOGC`.
  • Sin `free` manual — pero `sync.Pool` para reutilización de objetos.

4. Concurrencia (modelo CSP)

  • Goroutines: Hilos verdes (pila de 2 KB, crece/encoge). Millones posibles.
  • Canales: Tipados, síncronos (sin búfer) o asíncronos (con búfer). `select` para multiplexación.
  • Paquete sync: Mutex, RWMutex, WaitGroup, Once, Cond, Map.
  • Sin seguridad de carrera de datos — `go run -race` detecta en tiempo de ejecución.

5. Runtime

  • Programador: M:N (M hilos de SO, N goroutines). Robo de trabajo.
  • Sysmon: Preemptión, ritmo de GC, netpoll.
  • Vdso, preemptión asíncrona (1.14+), montón de temporizadores.

6. Biblioteca estándar (Baterías incluidas)

  • net/http (servidor/cliente de nivel productivo), crypto/tls, json, html/template, database/sql, testing, embed, time, context, sync, atomic, regexp, sort, flag, log/slog.

7. Herramientas

  • `go fmt` / `go vet` / `go test -race` / `go doc` / `go mod` / `go work` / `pprof` / `trace`.
  • LSP: gopls (VS Code, GoLand, Neovim).

Casos de uso típicos

  • Microservicios cloud-native (Kubernetes, Docker, etcd, Prometheus escritos en Go).
  • Herramientas CLI (Hugo, Terraform, kubectl, fzf).
  • Servicios de red de alto rendimiento (Cloudflare, Uber, Twitch, Dropbox).
  • Borde / WASM (TinyGo).

Go intercambia expresividad por simplicidad, velocidad de compilación, implementabilidad y rendimiento de concurrencia. Es el lenguaje de la infraestructura moderna.