errgroup til samtidig fejlhåndtering
golang.org/x/sync/errgroup i praksis
errgroup til samtidig fejlhåndtering er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.
Problemet med goroutiner og fejl
Når du starter goroutiner med go func(), kasseres returværdierne, herunder fejl. Du har brug for ekstra mekanismer (kanaler og WaitGroup) til at indsamle dem. errgroup gør dette enklere.
golang.org/x/sync/errgroup
errgroup.Group kører goroutiner og indsamler fejl. Wait() blokerer, indtil alle goroutiner er afsluttet, og returnerer den første fejl, der ikke er nil.
var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
log.Fatal(err)
}errgroup.WithContext
WithContext returnerer en gruppe og et afledt context. Contextet annulleres, når den første goroutine returnerer en fejl, så det resterende arbejde stopper.
g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()Indsamling af resultater sammen med fejl
errgroup indsamler ikke resultater, kun fejl. Gem resultaterne i forhåndsallokerede slices, der tilgås via indeks, for at undgå synkronisering:
results := make([]Result, len(items))
for i, item := range items {
i, item := i, item
g.Go(func() error {
r, err := process(ctx, item)
if err != nil { return err }
results[i] = r
return nil
})
}
if err := g.Wait(); err != nil { return err }g.SetLimit (Go 1.20+)
g.SetLimit(n) begrænser antallet af goroutiner, der kører samtidigt — det fungerer som en indlejret semafor uden en separat kanal.
g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
g.Go(func() error { return process(item) })
}g.TryGo
g.TryGo(f) starter kun goroutinen, hvis grænsen (angivet med SetLimit) tillader det. Returnerer false, hvis den ikke blev startet.
Kun den første fejl returneres
errgroup returnerer kun den første fejl. Hvis du har brug for alle fejl, skal du indsamle dem i en mutex-beskyttet slice inde i hver goroutine.
var mu sync.Mutex
var errs []error
g.Go(func() error {
if err := doWork(); err != nil {
mu.Lock(); errs = append(errs, err); mu.Unlock()
}
return nil
})Forskel fra sync.WaitGroup
WaitGroup holder styr på afslutning; errgroup holder styr på afslutning OG indsamler fejl. Foretræk errgroup, når en fejl i en goroutine skal rapporteres.
Videregivelse af annullering gennem context
Når du bruger errgroup.WithContext, signalerer det afledte contexts annullering til alle andre goroutiner, at de skal stoppe — svarende til semantikken, hvor den første fejl udløser annullering.
Test af errgroup-kode
Indsæt i tests et context med WithTimeout for at sikre, at gruppen ikke kører for evigt, hvis en goroutine hænger.
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)Alternativ til semafor
Før SetLimit (Go < 1.20) kan du bruge en bufferlagt kanal som semafor inde i de enkelte goroutiner for at opnå samme effekt.
Hurtigt tjek
Hvad returnerer errgroup.WithContext, som en almindelig errgroup.Group ikke returnerer?
Opsummering: errgroup
Vigtige punkter:
g.Go(func() error)— start en goroutine, og indsamle den første fejlg.Wait()— blokerer, indtil alle er færdige; returnerer den første fejlWithContext— context annulleres ved den første fejlg.SetLimit(n)— begrænser samtidige goroutiner (Go 1.20+)
Lær Go med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “errgroup til samtidig fejlhåndtering” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “errgroup til samtidig fejlhåndtering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “errgroup til samtidig fejlhåndtering”?
golang.org/x/sync/errgroup i praksis Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Go Academy?
Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “errgroup til samtidig fejlhåndtering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Go Academy-lektion?
Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Pipeline- og stage-mønstre
- errgroup til samtidig fejlhåndtering
- Semaphore-mønsteret
- Detektering af leaks og annullering