Comment fonctionne Go (Golang) : Compilation, Concurrence, Mémoire et Runtime
Go (Golang) est un langage à typage statique, compilé, conçu chez Google (2007, open-sourcé 2009) par Robert Griesemer, Rob Pike, Ken Thompson. Ce n'est pas « Gopher » — c'est la mascotte.
1. Pipeline de compilation
.go source → go build → SSA IR → Code machine (ELF/Mach-O/PE) → Binaire statique
- Pas de VM, pas d'interpréteur. Binaire unique = déploiement facile.
- Compilation rapide : ~1M lignes/sec (Go 1.22+).
- Cross-compile : `GOOS=linux GOARCH=amd64 go build` — pas d'installation toolchain sur cible.
2. Système de types
- Statique, structurel (interfaces satisfaites implicitement), pas d'héritage.
- Génériques (depuis 1.18) : paramètres de type, contraintes.
- Valeurs nulles : `var x int` → 0 ; `var s string` → "" ; `var p *T` → nil.
3. Gestion mémoire
- Analyse d'échappement (compile-time) : décide allocation tas vs pile.
- Garbage Collector : Concurrent, tri-color mark-sweep, non-générationnel, faible latence (<1 ms typique). Réglable `GOGC`.
- Pas de `free` manuel — mais `sync.Pool` pour réutilisation objets.
4. Concurrence (Modèle CSP)
- Goroutines : Threads verts (2 Ko pile, grandit/rétrécit). Millions possibles.
- Canaux : Typés, synchrones (non bufferisés) ou asynchrones (bufferisés). `select` pour multiplexage.
- sync pkg : Mutex, RWMutex, WaitGroup, Once, Cond, Map.
- Pas de sécurité data race — `go run -race` détecte à l'exécution.
5. Runtime
- Ordonnanceur : M:N (M threads OS, N goroutines). Work-stealing.
- Sysmon : Prémption, cadencement GC, netpoll.
- Vdso, prémption asynchrone (1.14+), tas timers.
6. Bibliothèque standard (Batteries incluses)
- net/http (serveur/client production-grade), crypto/tls, json, html/template, database/sql, testing, embed, time, context, sync, atomic, regexp, sort, flag, log/slog.
7. Outillage
- `go fmt` / `go vet` / `go test -race` / `go doc` / `go mod` / `go work` / `pprof` / `trace`.
- LSP : gopls (VS Code, GoLand, Neovim).
Cas d'usage typiques
- Microservices cloud-native (Kubernetes, Docker, etcd, Prometheus écrits en Go).
- Outils CLI (Hugo, Terraform, kubectl, fzf).
- Services réseau haut débit (Cloudflare, Uber, Twitch, Dropbox).
- Edge / WASM (TinyGo).
Go échange expressivité pour simplicité, vitesse compilation, déployabilité, et débit concurrence. C'est le langage de l'infrastructure moderne.
