sync.WaitGroup
Wachten op een groep goroutines
sync.WaitGroup is een gratis Go Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Go Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Go Academy bevat in totaal 4 lessen.
Doel
sync.WaitGroup wacht totdat een verzameling goroutines is voltooid. De hoofd-goroutine roept Add aan om de teller in te stellen, elke goroutine roept Done aan wanneer deze klaar is en Wait blokkeert totdat de teller nul bereikt.
Basisgebruik
Roep Add aan voordat je elke goroutine start, Done aan het einde van elke goroutine (via defer) en Wait nadat je alle goroutines hebt gestart.
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(v Item) {
defer wg.Done()
process(v)
}(item)
}
wg.Wait()Add moet gebeuren voordat de goroutine start
Roep wg.Add(1) aan voordat je go func() start, nooit daarbinnen. Anders kan Wait terugkeren voordat de goroutine zichzelf registreert.
Veelgemaakte fout: vastleggen van de lusvariabele
Geef de lusvariabele als argument door aan de goroutinefunctie, niet via een afsluiting, om te voorkomen dat alle goroutines dezelfde variabele delen.
for _, v := range items {
wg.Add(1)
go func(item Item) { // correct: copy
defer wg.Done()
process(item)
}(v)
}Een WaitGroup opnieuw gebruiken
Je kunt een WaitGroup opnieuw gebruiken nadat Wait is teruggekeerd, maar alleen als alle eerdere aanroepen van Done zijn voltooid. Gebruik de WaitGroup niet opnieuw terwijl er nog aanroepen van Done actief zijn.
WaitGroup met resultaten
WaitGroup verzamelt geen resultaten — combineer het met een kanaal of een slice (met een mutex) om uitvoer van goroutines te verzamelen.
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 met een totaal aantal
Je kunt het totale aantal in één Add-aanroep vóór de lus doorgeven. Dat is iets efficiënter dan één Add-aanroep per goroutine.
wg.Add(len(items))
for _, item := range items {
go func(v Item) { defer wg.Done(); process(v) }(item)
}Kopieer een WaitGroup niet
Net als Mutex mag een WaitGroup na het eerste gebruik niet worden gekopieerd. Geef de WaitGroup door via een pointer of neem deze op in een structuur die via een pointer wordt doorgegeven.
WaitGroup tegenover errgroup
golang.org/x/sync/errgroup omhult WaitGroup en voegt het doorgeven van fouten toe. Gebruik bij voorkeur errgroup wanneer een fout in een goroutine de andere goroutines moet stoppen.
Combineren met context
Gebruik errgroup.WithContext voor zowel de semantiek van WaitGroup als een context die bij de eerste fout wordt geannuleerd, zodat alle goroutines netjes stoppen.
g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
if err := g.Wait(); err != nil { log.Fatal(err) }De nulwaarde is bruikbaar
De nulwaarde van sync.WaitGroup is direct bruikbaar — je hebt geen constructor nodig. Declareer de WaitGroup en roep Add aan.
Korte controle
Wat gebeurt er als je wg.Add(1) in de goroutine aanroept in plaats van voordat je deze start?
Samenvatting: sync.WaitGroup
Belangrijkste punten:
- Roep Add aan voordat je de goroutine start; gebruik Done via defer in de goroutine
- Wait blokkeert totdat de teller nul bereikt
- Kopieer de WaitGroup nooit en roep Add nooit in de goroutine aan
- Gebruik errgroup om fouten door te geven
Leer Go met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “sync.WaitGroup” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Go Academy, waaronder “sync.WaitGroup”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Go Academy bevat in totaal 4 lessen.
Wat leer ik in “sync.WaitGroup”?
Wachten op een groep goroutines Je oefent met Go Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Go Academy te beginnen?
Ervaring vooraf is niet nodig. Go Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “sync.WaitGroup”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Go Academy?
Ja. Elke les over Go Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.