Come Funziona Go (Golang): Compilazione, Concorrenza, Memoria e Runtime
Go (Golang) è un linguaggio compilato tipizzato staticamente progettato da Google (2007, open-source 2009) da Robert Griesemer, Rob Pike, Ken Thompson. Non è "Gopher" — quella è la mascotte.
1. Pipeline di Compilazione
.go source → go build → SSA IR → Machine Code (ELF/Mach-O/PE) → Static Binary
- Nessuna VM, nessun interprete. Singolo binario = deploy semplice.
- Compilazione veloce: ~1M linee/sec (Go 1.22+).
- Cross-compilazione: `GOOS=linux GOARCH=amd64 go build` — nessuna installazione toolchain sul target.
2. Sistema di Tipi
- Statico, strutturale (interfacce soddisfatte implicitamente), niente ereditarietà.
- Generics (da 1.18): parametri di tipo, vincoli.
- Valori zero: `var x int` → 0; `var s string` → ""; `var p *T` → nil.
3. Gestione della Memoria
- Escape Analysis (in fase di compilazione): decide allocazione heap vs stack.
- Garbage Collector: concorrente, mark-sweep tricolore, non generazionale, bassa latenza (<1 ms tipico). Regolabile `GOGC`.
- Nessun `free` manuale — ma `sync.Pool` per il riuso di oggetti.
4. Concorrenza (Modello CSP)
- Goroutine: thread verdi (stack 2 KB, cresce/riduce). Milioni possibili.
- Canali: tipizzati, sincroni (non bufferizzati) o asincroni (bufferizzati). `select` per multiplexing.
- pacchetto sync: Mutex, RWMutex, WaitGroup, Once, Cond, Map.
- Nessuna sicurezza da race condition — `go run -race` rileva in fase di esecuzione.
5. Runtime
- Scheduler: M:N (M thread OS, N goroutine). Work-stealing.
- Sysmon: preempzione, pacing GC, netpoll.
- Vdso, preempzione asincrona (1.14+), heap timer.
6. Libreria Standard (Batterie Incluse)
- net/http (server/client di livello produzione), crypto/tls, json, html/template, database/sql, testing, embed, time, context, sync, atomic, regexp, sort, flag, log/slog.
7. Strumenti
- `go fmt` / `go vet` / `go test -race` / `go doc` / `go mod` / `go work` / `pprof` / `trace`.
- LSP: gopls (VS Code, GoLand, Neovim).
Casi d'Uso Tipici
- Microservizi cloud-native (Kubernetes, Docker, etcd, Prometheus scritti in Go).
- Strumenti CLI (Hugo, Terraform, kubectl, fzf).
- Servizi di rete ad alto throughput (Cloudflare, Uber, Twitch, Dropbox).
- Edge / WASM (TinyGo).
Go sacrifica l'espressività per semplicità, velocità di compilazione, deployabilità e throughput di concorrenza. È il linguaggio dell'infrastruttura moderna.