Deux lettres — go — et une fonction part seule. Qui l'attend ?Two letters — go — and a function leaves alone. Who waits for it?
Trois lignes que tout le monde écrit le premier jour. Le programme compile, tourne, et n'imprime rien — ou presque. Ce n'est pas un bug de fmt : c'est le modèle entier de Go qui tient dans un seul go. Lancer une goroutine est trivial ; l'attendre est tout le sujet.Three lines everyone writes on day one. The program compiles, runs, and prints nothing — or almost. It's no fmt bug: it's all of Go's model fitting inside a single go. Launching a goroutine is trivial; waiting for it is the whole point.
func main() { go fmt.Println("hello from the goroutine") // main ne l'attend pas — il continue, puis se termine } // ← ici le programme s'arrête : "hello" ne s'imprime (presque) jamais
Le go n'a pas exécuté Println : il l'a planifié. Quand main retourne, le runtime arrête tout — sans attendre la goroutine, qui n'a pas même eu son tour.The go didn't run Println: it scheduled it. When main returns, the runtime stops everything — without waiting for the goroutine, which never even got its turn.
« Qui lance cette goroutine — et qui l'attend, qui l'arrête ? » Une goroutine n'a pas de valeur de retour qu'on récupère, pas de parent qui la join par défaut. Sa fin n'est garantie par personne : c'est à toi de tendre le fil qui la rejoint."Who launches this goroutine — and who waits for it, who stops it?" A goroutine has no return value you collect, no parent that joins it by default. Nobody guarantees its end: it's on you to run the thread that rejoins it.
Tout le reste de Go en concurrence — channels, select, WaitGroup, context — est une réponse à cette question. On ne commence pas par la syntaxe des channels : on commence par un go qui part dans le vide. Comprends le cycle de vie d'une goroutine, et la concurrence cesse d'être une loterie.Everything else in concurrent Go — channels, select, WaitGroup, context — answers this question. We don't start with channel syntax: we start with a go vanishing into the void. Understand a goroutine's lifecycle, and concurrency stops being a lottery.