Un go, on savait le rejoindre. Mais mille ?One go, we knew how to rejoin. But a thousand?
Au numéro précédent, on a appris à attendre une goroutine : un Wait, un <-done, et le fil est rejoint. Mais le vrai code n'en lance presque jamais une seule — il en sème une par URL, par ligne, par job. Lire N signaux à la main, c'est promettre de compter juste : un de trop, on bloque ; un de moins, on file trop tôt. Il faut un objet qui tienne le compte à notre place.Last issue we learned to wait for a goroutine: a Wait, a <-done, and the thread is rejoined. But real code almost never launches just one — it scatters one per URL, per row, per job. Reading N signals by hand means promising to count right: one too many, you block; one too few, you leave early. You need an object that keeps the count for you.
func main() { for _, u := range urls { go fetch(u) // on en lance N… et puis ? } } // main file vers sa fin : aucune des N n'est attendue
Un sync.WaitGroup n'est qu'un compteur partagé : on l'incrémente avant de lancer, chaque goroutine le décrémente en finissant, et Wait dort jusqu'au retour à zéro. Pas de temps, pas de devinette — de la comptabilité.A sync.WaitGroup is just a shared counter: you bump it before launching, each goroutine drops it on finishing, and Wait sleeps until it returns to zero. No time, no guessing — bookkeeping.
« Add avant le go, Done en defer, Wait une fois. » Trois gestes, un ordre. Tout le reste de ce numéro est ce qui arrive quand on les met dans le mauvais ordre — ou quand la variable de boucle s'invite dans la goroutine."Add before the go, Done in a defer, Wait once." Three moves, one order. The rest of this issue is what happens when you get the order wrong — or when the loop variable sneaks into the goroutine.
Le WaitGroup ne transporte aucune donnée : il ne dit pas ce que chaque goroutine a produit, seulement qu'elles ont toutes fini. Pour récupérer des résultats, il faudra un channel (Vol. 2). Ici, on répond à une seule question — « sont-elles toutes rentrées ? » — et on y répond sans jamais partager autre chose qu'un entier protégé.The WaitGroup carries no data: it doesn't say what each goroutine produced, only that they all finished. To collect results you'll need a channel (Vol. 2). Here we answer one question — 'are they all back?' — and answer it without ever sharing more than one guarded integer.