Blog

Go 1.25's WaitGroup.Go(): Gleichzeitiger Code wird fehlerfrei

Kubilay Karpat

Kubilay Karpat

Aktualisiert März 17, 2026
4 Minuten

Gleichzeitigkeitsprobleme gehören zu den frustrierendsten Problemen bei der Go-Programmierung. Wahrscheinlich haben Sie das auch schon erlebt: Ihr Programm stürzt mit einer Panik ab, der Stack-Trace zeigt auf sync.WaitGroup und Sie stellen fest, dass Sie einen einzigen Aufruf von Add() oder Done() vergessen haben. Diese Fehler sind leicht zu machen, aber mühsam zu debuggen, besonders in der Produktion.

Go 1.25 führt WaitGroup.Go() ein, eine Methode, die eine ganze Klasse dieser Fehler eliminiert, indem sie ein Prinzip aus der schlanken Produktion anwendet: poka-yoke (Fehlersicherung). Lassen Sie uns erkunden, wie diese neue Funktionalität nebenläufigen Go-Code sicherer und wartbarer macht.

Das traditionelle WaitGroup-Muster (und seine Fallstricke)

Sehen wir uns zunächst an, wie wir WaitGroups normalerweise verwenden:

func processItems(items []string) {
    var wg sync.WaitGroup

    for _, item := range items {
        wg.Add(1)
        go func(item string) {
            defer wg.Done()
            processItem(item)
        }(item)
    }

    wg.Wait()
}

Dieses Muster funktioniert, aber es ist anfällig. Beachten Sie diesen häufigen Fehler:

Vergessen Done()

func processItems(items []string) {
    var wg sync.WaitGroup

    for _, item := range items {
        wg.Add(1)
        go func(item string) {
            // Oops! Forgot defer wg.Done()
            processItem(item)
        }(item)
    }

    wg.Wait() // This will block forever
}

Die Ursache dafür? Die API erfordert, dass Sie die Aufrufe von Add() und Done() manuell koppeln, was gegen das Poka-Yoke-Prinzip verstößt.

Geben Sie WaitGroup.Go() ein: Poka-Yoke für Gleichzeitigkeit

Poka-yoke (ポカヨケ) ist ein japanischer Begriff aus der schlanken Produktion, der "Fehlersicherung" oder "Fehlersicherheit" bedeutet. Er bezieht sich auf jeden Mechanismus, der Fehler durch Design verhindert, anstatt sich auf Wachsamkeit zu verlassen. Denken Sie an eine Mikrowelle, die nicht anspringt, wenn die Tür offen ist.

Die neue Methode WaitGroup.Go() wendet dieses Prinzip auf die gleichzeitige Programmierung an:

func processItems(items []string) {
    var wg sync.WaitGroup

    for _, item := range items {
        wg.Go(func() {
            processItem(item)
        })
    }

    wg.Wait()
}

Merken Sie, was hier fehlt? Kein Add(), kein Done(), kein defer. Die Methode Go() erledigt beides automatisch:

  1. Er erhöht den Zähler (wie Add(1))
  2. Er startet die Goroutine
  3. Es ruft automatisch Done() auf, wenn die Funktion beendet ist.

Sie können buchstäblich nicht vergessen. Die API macht es unmöglich, nicht übereinstimmende Add/Done-Paare zu erstellen.

Vorteile über die Sicherheit hinaus

Neben der Vermeidung von Fehlern bietet WaitGroup.Go() weitere Vorteile:

1. Reiniger Code

Weniger Textbausteine bedeuten, dass die Geschäftslogik im Vordergrund steht:

// Traditional: 3 lines of ceremony
wg.Add(1)
go func() {
    defer wg.Done()
    doWork()
}()

// With Go(): 1 line
wg.Go(func() { doWork() })

2. Einfachere Code-Überprüfungen

Prüfer müssen die Paarung Hinzufügen/Erledigt nicht mehr überprüfen. Wenn der Code kompiliert wird und Go() verwendet, ist er korrekt.

3. Besser für Anfänger

Neue Go-Entwickler haben oft Schwierigkeiten mit WaitGroups. Die Methode Go() reduziert die Lernkurve erheblich.

Wann Sie WaitGroup.Go() verwenden sollten

Verwenden Sie WaitGroup.Go(), wenn:

  • Ablegen von Goroutinen in einer Schleife
  • Jede Goroutine stellt eine unabhängige Arbeitseinheit dar
  • Sie möchten warten, bis alle Goroutinen abgeschlossen sind
  • Sie brauchen keine fein abgestufte Kontrolle darüber, wann Add() aufgerufen wird.

Bleiben Sie bei der traditionellen Add()/Done(), wenn:

  • Sie müssen mehrere Zählungen auf einmal hinzufügen (wg.Add(n))
  • Sie erhöhen den Zähler nur bedingt
  • Sie arbeiten mit veraltetem Code, der nicht einfach umstrukturiert werden kann

Fazit

WaitGroup.Go() ist ein perfektes Beispiel für poka-yoke im API-Design. Indem es das Richtige einfach und das Falsche unmöglich macht, beseitigt Go 1.25 eine ganze Kategorie von Gleichzeitigkeitsfehlern. Die Methode fügt keine neue Funktionalität hinzu: Sie könnten immer korrekten WaitGroup-Code schreiben, aber sie macht Korrektheit zum Standard.

Wie Bjarne Stroustrup einmal über C++ sagte: "Mache einfache Dinge einfach, und komplexe Dinge möglich." Go 1.25 geht für WaitGroups noch einen Schritt weiter: Es macht einfache Dinge sicher, was noch besser ist.

Weitere Einzelheiten finden Sie in den offiziellen Go 1.25 Release Notes.


Sind Sie bereit, es auszuprobieren? Go 1.25 ist jetzt verfügbar. Verwenden Sie WaitGroup.Go() in Ihrem nächsten Projekt und erleben Sie fehlerfreie Gleichzeitigkeit aus erster Hand.

Verfasst von

Kubilay Karpat

Contact

Let’s discuss how we can support your journey.