0Pricing
Go Academy · Lektion

sync.WaitGroup

Auf eine Gruppe von Goroutines warten

sync.WaitGroup ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Zweck

sync.WaitGroup wartet, bis eine Gruppe von Goroutines beendet ist. Die Haupt-Goroutine ruft Add auf, um den Zähler festzulegen, und jede Goroutine ruft nach ihrer Fertigstellung Done auf. Wait blockiert, bis der Zähler null erreicht.

Grundlegende Verwendung

Rufen Sie Add vor dem Start jeder Goroutine auf, Done am Ende jeder Goroutine (über defer) und Wait, nachdem Sie alle Goroutines gestartet haben.

var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(v Item) {
        defer wg.Done()
        process(v)
    }(item)
}
wg.Wait()

Add muss vor dem Start der Goroutine erfolgen

Rufen Sie wg.Add(1) vor go func() auf, niemals innerhalb der Goroutine. Andernfalls kann Wait zurückkehren, bevor die Goroutine sich selbst registriert hat.

Häufiger Fehler: Erfassen der Schleifenvariable

Übergeben Sie die Schleifenvariable als Argument an die Goroutine-Funktion und nicht über eine Closure, damit nicht alle Goroutines dieselbe Variable verwenden.

for _, v := range items {
    wg.Add(1)
    go func(item Item) { // correct: copy
        defer wg.Done()
        process(item)
    }(v)
}

Wiederverwendung einer WaitGroup

Eine WaitGroup kann wiederverwendet werden, nachdem Wait zurückgekehrt ist, aber nur, wenn alle vorherigen Done-Aufrufe zurückgekehrt sind. Verwenden Sie sie nicht wieder, solange noch Done-Aufrufe ausstehen.

WaitGroup mit Ergebnissen

Eine WaitGroup sammelt keine Ergebnisse. Kombinieren Sie sie mit einem Channel oder einem Slice (mit Mutex), um die Ausgabe von Goroutines zu erfassen.

results := make([]Result, len(items))
for i, item := range items {
    wg.Add(1)
    go func(idx int, v Item) {
        defer wg.Done()
        results[idx] = process(v)
    }(i, item)
}
wg.Wait()

Add mit einer Gesamtanzahl

Sie können die Gesamtanzahl vor der Schleife an einen einzigen Add-Aufruf übergeben. Das ist etwas effizienter als ein Add-Aufruf pro Goroutine.

wg.Add(len(items))
for _, item := range items {
    go func(v Item) { defer wg.Done(); process(v) }(item)
}

Kopieren Sie eine WaitGroup nicht

Wie ein Mutex darf eine WaitGroup nach ihrer ersten Verwendung nicht kopiert werden. Übergeben Sie sie als Pointer oder betten Sie sie in eine Struktur ein, die als Pointer übergeben wird.

WaitGroup im Vergleich zu errgroup

golang.org/x/sync/errgroup kapselt eine WaitGroup und ergänzt die Weitergabe von Fehlern. Verwenden Sie errgroup bevorzugt, wenn der Fehler einer Goroutine die anderen stoppen soll.

Kombination mit Context

Verwenden Sie errgroup.WithContext, um sowohl die Semantik einer WaitGroup als auch einen Context zu erhalten, der beim ersten Fehler abgebrochen wird und dadurch alle Goroutines sauber beendet.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
if err := g.Wait(); err != nil { log.Fatal(err) }

Der Nullwert ist verwendbar

Der Nullwert von sync.WaitGroup ist sofort einsatzbereit – ein Konstruktor ist nicht erforderlich. Deklarieren Sie die WaitGroup einfach und rufen Sie Add auf.

Schnelltest

Was geschieht, wenn Sie wg.Add(1) innerhalb der Goroutine statt davor aufrufen?

Zusammenfassung: sync.WaitGroup

Wichtige Punkte:

  • Add vor dem Start der Goroutine; Done über defer innerhalb der Goroutine
  • Wait blockiert, bis der Zähler null erreicht
  • Niemals kopieren; Add niemals innerhalb der Goroutine aufrufen
  • Verwenden Sie errgroup zur Weitergabe von Fehlern

Häufig gestellte Fragen

Ist die Lektion „sync.WaitGroup“ kostenlos?

Ja — der vollständige Text von „sync.WaitGroup“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „sync.WaitGroup“?

Auf eine Gruppe von Goroutines warten Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „sync.WaitGroup“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. sync.Mutex und sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once und sync.Map
  4. Race Detector und sichere Patterns
← Zurück zu Go Academy