Go Concurrency Distilled ist ein neues Kurzbuch, das Go’s Concurrency-Primitive in eine Reihe interaktiver Beispiele verwandelt, die man ändern und direkt auf der Seite ausführen kann. Das Buch behandelt Goroutinen, Channels, Select, Wait Groups, Mutexe, Semaphore und mehr, jeweils mit Live-Code-Schnipseln, die man bearbeiten und ausführen kann. Es gibt auch eine PDF-Version mit statischen Beispielen zum Drucken oder Offline-Lesen.
Das Buch wird als eine schnelle Auffrischung beschrieben, nicht als Einsteiger-Guide. Für eine tiefere Auseinandersetzung verweist der Autor Leser auf Gist of Go: Concurrency, ein separates Buch mit praktischen Übungen. Das gesamte Projekt ist KI-frei, was der Autor explizit vermerkt.
Goroutinen und Wait Groups
Goroutines are the building blocks of Go concurrency. You start one with the go keyword, and the Go runtime juggles them across operating system threads running on CPU cores. Goroutines are lighter than OS threads, so you can create hundreds or thousands of them without much overhead.
In the example above, two goroutines print „worker 1“ and „worker 2“ after being launched. A wait group (sync.WaitGroup) tracks their completion. The Add method sets the counter, Done decrements it, and Wait blocks until the counter reaches zero. That keeps the main function from exiting until both workers are finished.
There’s also a WaitGroup.Go method that combines the setup. It increments the counter, runs the function in a goroutine, and decrements the counter when the function ends.
Channels und Channel-Richtungen
Channels ermöglichen es Goroutinen, Werte aneinander zu übergeben. Ein Channel ist ein Fenster, durch das eine Goroutine einen Wert wirft und eine andere ihn auffängt. Das Senden eines Wertes über einen Channel ist synchron: Die sendende Goroutine blockiert, bis die empfangende Goroutine den Wert entgegennimmt.
The book shows a simple example where a goroutine sends „ping“ to a channel, and the main function reads it back. The sender blocks on ch <- val, and the receiver blocks on <-ch. Only when the value is received does the sending goroutine continue.
Wenn ein Channel nicht mehr benötigt wird, gibt Go’s Garbage Collector automatisch seine Ressourcen frei, unabhängig davon, ob er geschlossen ist oder nicht. Das Schließen eines Channels signalisiert den Lesern, dass alle Daten gesendet wurden. Der Leser prüft den Status des Channels mit einem zweiten Wert, dem sogenannten „Komma OK“-Status.
So prüft der Leser:
go
num, ok := <-in
if !ok {
break
}
If ok is false, the channel is closed and the loop stops. If ok is true, the reader gets the next value.
Richtungskanäle und gepufferte Kanäle
Channels can be bidirectional, send-only, or receive-only. Bidirectional channels are the default. Send-only channels can be declared with chan<- int, and receive-only channels are declared with <-chan int.
Man kann nicht von einem send-only-Channel lesen oder in einen receive-only-Channel schreiben, und man kann keinen receive-only-Channel schließen. Das Setzen der Richtung schützt vor versehentlichen Fehlern.
Gepufferte Channels funktionieren wie eine FIFO-Warteschlange mit einem festen Puffer. Das Schreiben in einen gepufferten Channel blockiert nicht, solange der Puffer Platz hat, und das Lesen blockiert nicht, solange der Puffer Werte enthält.
The cap and len functions work on buffered channels. cap shows the buffer size, and len shows how many values are currently stored.
Reading from a closed buffered channel works the same way as a regular channel. It returns values from the buffer until the buffer is empty, then returns a zero value with ok set to false.
Was dieses Buch bietet
Das interaktive Format ist der Reiz. Anstatt über Concurrency zu lesen, kann man den Code ändern und die Ergebnisse sofort sehen. Das ist wichtig für ein Thema, bei dem das Timing und die Reihenfolge von Ereignissen oft schwer aus Text allein zu verstehen sind.
Das Buch ist ebenfalls bemerkenswert für das Fehlen von KI-Beteiligung. In einem Feld, in dem automatisierte Werkzeuge allgegenwärtig sind, ist dies eine bewusste Entscheidung des Autors, und es ist erwähnenswert, zusammen mit den technischen Inhalten.
| Thema | Wesentliches Detail |
|---|---|
| Goroutinen | Started with the go keyword; tracked by sync.WaitGroup |
| Kanäle | Values passed synchronously; closed with close(ch) |
| Gepufferte Kanäle | FIFO queue with fixed buffer size; use cap and len |
| Richtungskanäle | chan<- for send-only, <-chan for receive-only |
Das Buch ist ein schnelles Buch für alle, die bereits Go kennen, ihr Verständnis von Nebenläufigkeit aber vertiefen möchten. Es ist kein Ersatz für den vollständigen Gist of Go: Concurrency, auf den der Autor Anfänger hinweist, aber es ist eine nützliche Ergänzung für den erfahrenen Entwickler, der eine kurze Wiederholung sucht.
Die interaktiven Beispiele sind der Star. Die Logik einer Goroutine zu ändern und die Ausgabe in Sekunden zu sehen, ist schneller, als eine Wand von Prosatexte zu lesen.
Das Buch ist eine willkommene Ergänzung des Go-Ökosystems. Es macht ein komplexes Thema durch kleine, ausführbare Beispiele zugänglich, und das ohne auf Automatisierung zurückzugreifen. Diese Kombination – praktische Interaktion und sorgfältiges Design – ist selten genug, um einen Blick wert zu sein.
Ausgangsmaterial: „Go Concurrency Distilled“, antonz.org.
Das Notizbuch abonnieren.
Die besten Geschichten des Tages und jedes neue Urteil, in klarem Deutsch, um sieben im Postfach. Eine Mail am Tag, nicht mehr.

