Vol. I → IX
The Go Loop · KiosqueNewsstand
Blog  
Le Kiosque · Édition d'Apprentissage The Newsstand · Learning Edition

Une seule tension du modèle Go,
disséquée jusqu'à l'os.
One tension in Go's model,
dissected to the bone.

Une collection éditoriale pour le développeur qui ne veut pas confondre simple et facile. Un numéro = un mécanisme-clé, disséqué jusqu'à ce que la tension soit nue : quel bug il tient à distance, ce qu'il déplace du compilateur vers toi, et quand ne pas l'employer. On arrête de réciter la syntaxe — on écoute le modèle. Don't communicate by sharing memory; share memory by communicating. An editorial collection for the developer who refuses to confuse simple with easy. One issue = one key mechanism, dissected until the tension is bare: which bug it keeps at arm's length, what it shifts from the compiler onto you, and when not to use it. You stop reciting syntax — you listen to the model. Don't communicate by sharing memory; share memory by communicating.

Numéros parusIssues out
27
En préparationIn the works
00
À venirForthcoming
00
Les rayonsThe shelves
09 vol.vol.
Vol. I — Les goroutinesGoroutines Qui attend cette goroutine ?Who waits for this goroutine? · 03 numérosissues
DisponibleAvailable
Vol. 1 · №01 Juin 2026Jun 2026
01
go f(),
la fonction que personne n'attend
go f(),
the function nobody waits for

Deux lettres — go — et une fonction part vivre sa vie en parallèle. Le code naïf croit avoir lancé un travail ; il a surtout perdu le fil. Si main finit avant elle, la goroutine meurt sans un mot. Lancer est trivial ; tout le modèle de Go tient dans la question d'après : qui l'attend ? Two letters — go — and a function leaves to live in parallel. Naive code thinks it started a job; mostly it lost the thread. If main finishes first, the goroutine dies without a word. Launching is trivial; all of Go's model lives in the next question: who waits for it?

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●○○○
GoroutinesConcurrenceCycle de vie
DisponibleAvailable
Vol. 1 · №02 Juil 2026Jul 2026
02
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●○○○
WaitGroupSynchronisation
DisponibleAvailable
Vol. 1 · №03 Août 2026Aug 2026
03
La goroutine qui fuit The goroutine that leaks

Une goroutine bloquée sur un envoi que plus personne ne lit ne plante pas : elle reste, vivante et inutile, jusqu'à l'arrêt du process. La fuite la plus silencieuse de Go. On la voit, on la mesure, et on la ferme — par un channel de sortie ou un contexte. A goroutine blocked on a send nobody reads doesn't crash: it lingers, alive and useless, until the process dies. Go's quietest leak. We make it visible, measure it, and shut it down — with a done channel or a context.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●○○
FuiteChannelsCycle de vie
Vol. II — Les channelsChannels Communiquer, ou partager ?Communicate, or share? · 03 numérosissues
DisponibleAvailable
Vol. 2 · №01 Sep 2026Sep 2026
01
Le channel,
une valeur qui change de main
The channel,
a value changing hands

Un channel n'est pas une file d'attente : c'est un point de rendez-vous où la propriété d'une donnée passe d'une goroutine à l'autre. Bufferisé ou non, c'est la même idée — envoyer plutôt que partager derrière un verrou. Le cœur du slogan : partage la mémoire en communiquant. A channel isn't a queue: it's a rendezvous where a value's ownership passes from one goroutine to another. Buffered or not, same idea — send rather than share behind a lock. The heart of the slogan: share memory by communicating.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
ChannelsCommunication
DisponibleAvailable
Vol. 2 · №02 Oct 2026Oct 2026
02
select,
écouter plusieurs voix
select,
listening to many voices

Quand plusieurs channels parlent en même temps, select choisit celui qui est prêt. Avec default, il n'attend pas ; avec time.After, il pose un délai. Et un select{} sans cas, c'est le blocage éternel — parfois voulu, souvent un bug. When several channels speak at once, select picks the one that's ready. With default, it doesn't wait; with time.After, it sets a deadline. And a select{} with no case is an eternal block — sometimes intended, often a bug.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●○○
selectMultiplexageTimeout
DisponibleAvailable
Vol. 2 · №03 Nov 2026Nov 2026
03
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●○○
closeBroadcastrange
Vol. III — Les interfacesInterfaces Que demande l'appelant ?What does the caller need? · 03 numérosissues
DisponibleAvailable
Vol. 3 · №01 Déc 2026Dec 2026
01
L'interface implicite The implicit interface

En Go, un type satisfait une interface sans jamais le déclarer — il suffit qu'il ait les méthodes. L'abstraction appartient à celui qui consomme, pas à celui qui fournit. D'où la règle : accepte des interfaces, retourne des structs. In Go, a type satisfies an interface without ever declaring it — having the methods is enough. The abstraction belongs to the consumer, not the provider. Hence the rule: accept interfaces, return structs.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●○○
InterfacesDuck typing
DisponibleAvailable
Vol. 3 · №02 Jan 2027Jan 2027
02
L'interface nil qui n'est pas nil The nil interface that isn't nil

Un *T nil rangé dans une interface n'est pas == nil : l'interface porte un type, donc elle est non vide. Le piège trahit le réflexe le plus sacré de Go — if err != nil — et fait passer une erreur absente pour présente. On le voit, on l'explique, on l'évite. A nil *T stored in an interface is not == nil: the interface carries a type, so it's non-empty. The trap betrays Go's most sacred reflex — if err != nil — making an absent error look present. We make it visible, explain it, avoid it.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●●○
nilInterfacesPiège
DisponibleAvailable
Vol. 3 · №03 Fév 2027Feb 2027
03
La valeur derrière l'interface The value behind the interface

Une interface, c'est une paire (type, valeur). L'assertion x.(T) et le type switch la rouvrent ; le boxing et l'indirection la paient. Quand any sauve la mise, et quand il faut s'en passer. An interface is a (type, value) pair. The x.(T) assertion and the type switch reopen it; boxing and indirection pay for it. When any saves the day, and when to do without it.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●●○
InterfacesType assertionCoût
Vol. IV — L'erreur comme valeurErrors as values Erreur attendue, ou bug ?Expected error, or bug? · 03 numérosissues
DisponibleAvailable
Vol. 4 · №01 Mar 2027Mar 2027
01
if err != nil,
l'erreur qu'on retourne
if err != nil,
the error you return

Go n'a pas d'exceptions pour le flot normal : une erreur est une valeur, qu'on inspecte et qu'on propage à la main. La verbosité est le prix de l'explicite — et le _ = qui jette l'erreur est le seul vrai danger. Go has no exceptions for the normal path: an error is a value you inspect and propagate by hand. Verbosity is the price of being explicit — and the _ = that throws the error away is the only real danger.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●○○○
ErreursExplicite
DisponibleAvailable
Vol. 4 · №02 Avr 2027Apr 2027
02
Envelopper,
dérouler
Wrap,
unwrap

fmt.Errorf("%w", err) emballe une erreur dans un contexte sans la perdre ; errors.Is et errors.As la retrouvent au fond de la pile. Sentinelle ou typée, l'essentiel est de ne jamais casser la chaîne. fmt.Errorf("%w", err) wraps an error in context without losing it; errors.Is and errors.As find it back at the bottom of the stack. Sentinel or typed, the point is never to break the chain.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●○○
ErreursWrappingerrors.Is
DisponibleAvailable
Vol. 4 · №03 Mai 2027May 2027
03
panic / recover,
la frontière
panic / recover,
the boundary

panic n'est pas un try/catch : on panique quand un invariant est rompu, pas pour une erreur attendue. recover ne se pose qu'à la lisière — une requête, une goroutine — et un panic non rattrapé emporte tout le process. panic isn't a try/catch: you panic when an invariant breaks, not for an expected error. recover sits only at the boundary — a request, a goroutine — and an uncaught panic takes the whole process down.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●●○
panicrecoverInvariants
Vol. V — Slices & mapsSlices & maps Partage-t-elle son tableau ?Does it share its backing array? · 03 numérosissues
DisponibleAvailable
Vol. 5 · №01 Juin 2027Jun 2027
01
La slice,
une vue sur un tableau
The slice,
a view over an array

Une slice est trois mots — pointeur, longueur, capacité — posés sur un tableau. La copier copie la vue, pas les données. D'où la surprise : modifier b := a[1:3] modifie a, car les deux regardent le même tableau. A slice is three words — pointer, length, capacity — laid over an array. Copying it copies the view, not the data. Hence the surprise: changing b := a[1:3] changes a, because both look at the same array.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●○○
SlicesAliasing
DisponibleAvailable
Vol. 5 · №02 Juil 2027Jul 2027
02
append,
la réallocation qui surprend
append,
the realloc that surprises

append écrit parfois en place, parfois dans un tableau tout neuf — selon la capacité restante. Tant qu'on partage le cap, deux slices se marchent dessus ; dès qu'on réalloue, elles divergent. Le bug le plus subtil de Go tient dans cette frontière. append sometimes writes in place, sometimes into a brand-new array — depending on remaining capacity. While the cap is shared, two slices clobber each other; once it reallocates, they diverge. Go's subtlest bug lives on that boundary.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●●○
appendRéallocationPiège
DisponibleAvailable
Vol. 5 · №03 Août 2027Aug 2027
03
La map,
ni ordonnée ni concurrente
The map,
neither ordered nor concurrent

L'itération d'une map est aléatoire par conception ; écrire dans une map nil panique ; lire et écrire en concurrence plante le programme avec un message sans appel. Trois garanties que Go refuse exprès — et ce qu'on met à la place. Map iteration is random by design; writing to a nil map panics; concurrent read-write crashes the program with a blunt message. Three guarantees Go deliberately refuses — and what you put in their place.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●●○○
MapsConcurrencenil
Vol. VI — Valeur ou pointeurValue or pointer Copie, ou partage ?Copy, or share? · 03 numérosissues
DisponibleAvailable
Vol. 6 · №01 Sep 2027Sep 2027
01
Tout est copié Everything is copied

En Go, passer une valeur, c'est la copier — struct comprise, champ par champ. Parfois c'est un service (une copie ne peut pas être mutée ailleurs), parfois c'est un coût (une grosse struct recopiée à chaque appel). Savoir lequel, c'est tout l'art. In Go, passing a value copies it — structs included, field by field. Sometimes that's a gift (a copy can't be mutated elsewhere), sometimes a cost (a big struct re-copied on every call). Knowing which is the whole craft.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●○○
ValeurCopie
DisponibleAvailable
Vol. 6 · №02 Oct 2027Oct 2027
02
Le receveur,
valeur ou pointeur
The receiver,
value or pointer

func (t T) ou func (t *T) ? Le receveur valeur travaille sur une copie et ne mute rien ; le receveur pointeur mute l'original. Le choix décide aussi du jeu de méthodes — et de ce qui satisfait une interface. func (t T) or func (t *T)? A value receiver works on a copy and mutates nothing; a pointer receiver mutates the original. The choice also decides the method set — and what satisfies an interface.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●○○
ReceveurMéthodesPointeur
DisponibleAvailable
Vol. 6 · №03 Nov 2027Nov 2027
03
La copie qui casse The copy that breaks

Copier une struct qui contient un sync.Mutex, c'est copier un verrou à moitié pris — et go vet te l'interdit pour de bonnes raisons. WaitGroup, slices partagées : certains types ne survivent pas à une copie. La règle copylocks, et pourquoi. Copying a struct that holds a sync.Mutex copies a half-held lock — and go vet forbids it for good reason. WaitGroup, shared slices: some types don't survive a copy. The copylocks rule, and why.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●●●○
CopieMutexgo vet
Vol. VII — defer · panic · recoverdefer · panic · recover Quand le contrôle remonte ?When does control unwind? · 03 numérosissues
DisponibleAvailable
Vol. 7 · №01 Déc 2027Dec 2027
01
defer,
la promesse différée
defer,
the deferred promise

defer planifie du code pour la sortie de fonction, quelle que soit la sortie — en pile LIFO. On libère une ressource juste à côté de son acquisition. Reste un piège : l'erreur de defer f.Close() qu'on laisse filer sans la regarder. defer schedules code for the function's exit, whatever the exit — LIFO order. You free a resource right next to where you acquired it. One trap remains: the error from defer f.Close() that slips away unlooked-at.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●○○○
deferRessources
DisponibleAvailable
Vol. 7 · №02 Jan 2028Jan 2028
02
La capture du defer What defer captures

Les arguments d'un defer sont évalués à l'instant du defer ; son corps, lui, s'exécute à la sortie. Toute la subtilité — et le bug de la variable de boucle, et le defer qui s'accumule dans une boucle — tient dans cet écart. A defer's arguments are evaluated at the moment of defer; its body runs at exit. All the subtlety — the loop-variable bug, the defer piling up inside a loop — lives in that gap.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 16 min
NiveauLevel ●●●○
deferCapturePiège
DisponibleAvailable
Vol. 7 · №03 Fév 2028Feb 2028
03
recover sans masquer recover without masking

recover transforme un panic en valeur — à la frontière d'une requête ou d'une goroutine, pas partout. Le danger n'est pas de paniquer, c'est d'avaler un bug en silence. Re-paniquer, nommer le retour, ne jamais cacher l'invariant rompu. recover turns a panic into a value — at the boundary of a request or a goroutine, not everywhere. The danger isn't panicking, it's swallowing a bug silently. Re-panic, name the return, never hide the broken invariant.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●●●○
recoverFrontière
Vol. VIII — Le contexteContext Qui peut annuler ça ?Who can cancel this? · 03 numérosissues
DisponibleAvailable
Vol. 8 · №01 Mar 2028Mar 2028
01
context.Context,
l'annulation qui descend
context.Context,
cancellation flowing down

context.Context est le câble qui traverse les couches : du handler HTTP jusqu'à la requête SQL. Premier argument, jamais stocké, toujours propagé. Quand le haut annule, tout ce qui en dépend l'apprend par Done(). context.Context is the cable threading through layers: from the HTTP handler down to the SQL query. First argument, never stored, always propagated. When the top cancels, everything below hears it through Done().

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●○○
contextAnnulation
DisponibleAvailable
Vol. 8 · №02 Avr 2028Apr 2028
02
Timeout & deadline Timeout & deadline

WithTimeout et WithDeadline posent une limite de temps à un arbre de goroutines. Le defer cancel() n'est pas optionnel : l'oublier, c'est fuir un contexte et les ressources qu'il tenait. Le délai qui descend, et le nettoyage qui remonte. WithTimeout and WithDeadline put a time limit on a tree of goroutines. The defer cancel() isn't optional: forgetting it leaks a context and the resources it held. The deadline flowing down, the cleanup flowing back up.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●●○○
TimeoutDeadlinecontext
DisponibleAvailable
Vol. 8 · №03 Mai 2028May 2028
03
La valeur dans le contexte (et pourquoi s'en méfier) The value in the context (and why to distrust it)

WithValue glisse une donnée dans le contexte — pratique, et dangereux. Clés typées, jamais une string nue ; un request ID y a sa place, une dépendance non. Le contexte n'est pas un sac à injection. WithValue slips a datum into the context — handy, and dangerous. Typed keys, never a bare string; a request ID belongs there, a dependency doesn't. The context is not an injection bag.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 15 min
NiveauLevel ●●●○
contextValuesAnti-pattern
Vol. IX — Le coût réelThe real cost Connais-tu le coût, ou l'imagines-tu ?Do you know the cost, or guess it? · 03 numérosissues
DisponibleAvailable
Vol. 9 · №01 Juin 2028Jun 2028
01
L'escape analysis Escape analysis

Le compilateur décide, seul, si une valeur vit sur la pile (gratuite) ou s'échappe vers le tas (allouée, ramassée plus tard). Retourner &x l'envoie au tas ; une interface peut l'y pousser aussi. -gcflags=-m te montre la décision. The compiler alone decides whether a value lives on the stack (free) or escapes to the heap (allocated, collected later). Returning &x sends it to the heap; an interface can push it there too. -gcflags=-m shows you the decision.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●●
Escape analysisPileTas
DisponibleAvailable
Vol. 9 · №02 Juil 2028Jul 2028
02
Le GC et la pression d'allocation The GC and allocation pressure

Le ramasse-miettes de Go est concurrent et discret — la bonne réponse est rarement de le tuner, presque toujours d'allouer moins. sync.Pool, mesures avant optimisation, pprof. On regarde le coût au lieu de l'imaginer. Go's garbage collector is concurrent and quiet — the right answer is rarely to tune it, almost always to allocate less. sync.Pool, measure before optimizing, pprof. We look at the cost instead of guessing it.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●●●
GCAllocationpprof
DisponibleAvailable
Vol. 9 · №03 Août 2028Aug 2028
03
Le scheduler The scheduler

Des centaines de milliers de goroutines tiennent sur une poignée de threads OS — c'est le scheduler M:N qui les fait danser. GOMAXPROCS, préemption, et la vieille histoire de la goroutine en boucle serrée qui affamait les autres (et pourquoi c'est presque fini). Hundreds of thousands of goroutines ride on a handful of OS threads — the M:N scheduler makes them dance. GOMAXPROCS, preemption, and the old tale of the tight-loop goroutine that starved the others (and why that's nearly over).

PubliéPublished ~ 5 chap.
LectureRead time ≈ 17 min
NiveauLevel ●●●●
SchedulerGOMAXPROCSPréemption
Mot de l'éditeurFrom the editor

Pas une syntaxe. Un modèle. Not a syntax. A model.

Le piège, en apprenant Go, c'est de prendre la simplicité pour de la facilité — d'écrire go f(), if err != nil, une slice qu'on tranche, sans voir la tension que chaque facilité déplace du compilateur vers toi. Chaque numéro dissèque une seule tension : concurrence, communication, satisfaction implicite, valeur, coût. Le bug qu'on tient à distance d'abord, le prix ensuite, et le contre-exemple — quand ne pas l'employer. The trap, learning Go, is mistaking simple for easy — writing go f(), if err != nil, a slice you reslice, without seeing the tension each convenience shifts from the compiler onto you. Each issue dissects a single tension: concurrency, communication, implicit satisfaction, value, cost. The bug you keep at bay first, the price next, and the counter-example — when not to use it.

La règle tacite, signée Rob Pike : ne communique pas en partageant la mémoire ; partage la mémoire en communiquant. Go ne te refuse presque rien — il compile, et te fait confiance pour tenir l'invariant qu'il ne vérifie pas. Comprends ce que la facilité te coûte, et tu cesses de lutter contre le runtime : tu l'écoutes. The unspoken rule, from Rob Pike: don't communicate by sharing memory; share memory by communicating. Go refuses you almost nothing — it compiles, and trusts you to hold the invariant it won't check. Understand what convenience costs you, and you stop fighting the runtime: you listen to it.