Vol. 1 — № 02
The Go Loop · KiosqueNewsstand
Blog  
Un atelier Go · Édition d'ApprentissageA Go Workshop · Learning Edition

sync.WaitGroup, recoudre les goroutines sync.WaitGroup, stitching goroutines back

Lancer N goroutines est facile ; savoir qu'elles ont toutes fini l'est moins. Le WaitGroup compte, attend, et te rend la main — à condition de l'incrémenter au bon endroit. Le piège classique : Add dans la boucle, et une variable capturée par référence. Launching N goroutines is easy; knowing they've all finished, less so. The WaitGroup counts, waits, and hands control back — provided you increment it in the right place. The classic trap: Add inside the loop, and a variable captured by reference.

AudienceAudience
Dev qui sait lancer un go et veut en attendre N sans rien perdre Dev who can launch a go and wants to wait on N without losing a thing
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 16 min ●○○○ WaitGroupSynchronisation

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

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.

Le code qui lance N et n'en attend aucuneThe code that launches N and waits for none
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
Le compteur, en trois tempsThe counter, in three beats
wg.Add(3)
3
avant de lancerbefore launching
Done × 3Done × 3
wg.Done()
1
chacune en sortanteach on exit
dernier Donelast Done
wg.Wait()
0
débloque mainunblocks main

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.

Le réflexe du numéroThe issue's reflex

« 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.

Compter, ce n'est pas communiquer.Counting isn't communicating.

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.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Go Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Go Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand