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.