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

Fermer, c'est diffuser Closing is broadcasting

close ne détruit pas un channel : il annonce qu'il n'y aura plus rien. Tous les récepteurs en range sortent, tous les <-ch rendent la valeur nulle et ok=false. Mais envoyer sur un channel fermé panique — d'où la règle : seul l'émetteur ferme, jamais le récepteur. close doesn't destroy a channel: it announces nothing more is coming. Every range receiver exits, every <-ch returns the zero value and ok=false. But sending on a closed channel panics — hence the rule: only the sender closes, never the receiver.

AudienceAudience
Dev qui envoie et reçoit sur des channels et veut signaler la fin sans paniquer Dev who sends and receives on channels and wants to signal the end without panicking
Format
Self-paced
ChapitresChapters
5
Date
Nov 2026 Nov 2026
≈ 16 min ●●○○ closeBroadcastrange

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

Fermer un channel ne le détruit pas. Ça annonce la fin.Closing a channel doesn't destroy it. It announces the end.

On a passé deux numéros à faire circuler des valeurs : transmettre, choisir, attendre. Reste le dernier geste — dire « il n'y aura plus rien ». On l'imagine volontiers comme une destruction, un free() de channel. C'est l'inverse : close n'efface rien et ne libère aucune mémoire. C'est un signal, et un signal particulier — il ne s'adresse pas à un receveur, mais à tous à la fois. Là où un envoi parle à une seule oreille, close diffuse. C'est la seule opération des channels qui soit un broadcast.We've spent two issues moving values around: handing over, choosing, waiting. One last gesture remains — saying 'nothing more is coming.' It's tempting to picture it as destruction, a channel free(). It's the opposite: close erases nothing and frees no memory. It's a signal, and a peculiar one — it speaks not to one receiver, but to all of them at once. Where a send talks to a single ear, close broadcasts. It's the only channel operation that is a broadcast.

Signaler N goroutines à la main : il faut compter justeSignalling N goroutines by hand: you must count right
// arrêter 3 workers en leur envoyant un signal chacun
for i := 0; i < 3; i++ {
    quit <- struct{}{}     // un envoi PAR worker — il faut connaître N
}                          // un de trop : on bloque ; un de moins : un reste
Fermer : une annonce, entendue par tousClosing: one announcement, heard by all
close(quit)                // une annonce, entendue par TOUS
// chaque worker fait <-quit et se réveille en même temps
// pas de compte à tenir : N peut être 3, 300, ou inconnu
Une annonce, plusieurs oreillesOne announcement, many ears
close(ch)
l'émetteurthe sender
<-ch #1
réveillé ✓woken ✓
<-ch #2
réveillé ✓woken ✓
<-ch #3
réveillé ✓woken ✓

Un seul close(ch) réveille toutes les goroutines bloquées sur <-ch, en même temps, sans qu'on ait à savoir combien elles sont. C'est ce qui fait du channel fermé le signal d'arrêt idiomatique : on ne notifie pas un par un, on déclare une bonne fois.A single close(ch) wakes every goroutine blocked on <-ch, all at once, without your knowing how many there are. That's what makes the closed channel the idiomatic stop signal: you don't notify one by one, you declare it once and for all.

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

« Fermer, c'est dire ‹ plus rien › à tout le monde — et c'est l'émetteur qui le dit. » close est un broadcast côté production : celui qui envoie est le seul à savoir qu'il a fini, donc le seul légitime à fermer. Tout le numéro découle de cette asymétrie, et de ce qui panique quand on l'enfreint."Closing means saying 'no more' to everyone — and it's the sender who says it." close is a broadcast on the producing side: the one sending is the only one who knows it's done, so the only one entitled to close. The whole issue follows from that asymmetry, and from what panics when you break it.

Fermer n'est pas obligatoire.Closing isn't mandatory.

Un channel n'a pas besoin d'être fermé pour être ramassé : le GC s'en occupe quand plus personne ne le référence. On ne ferme que pour signaler — pour qu'un range s'arrête, ou qu'un broadcast d'arrêt parte. Fermer « par hygiène » un channel que personne n'attend ne sert à rien, et fermer celui qu'on ne possède pas est une faute. La question n'est jamais « ai-je fermé ? » mais « ai-je quelque chose à annoncer, et suis-je celui qui l'annonce ? ».A channel needn't be closed to be collected: the GC handles it once nothing references it. You close only to signal — so a range stops, or a stop-broadcast fires. Closing 'for hygiene' a channel no one awaits does nothing, and closing one you don't own is a mistake. The question is never 'did I close?' but 'do I have something to announce, and am I the one announcing it?'

🔒

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