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.
// 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
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
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.
« 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.
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?'