Go Academy · Lektion

errgroup til samtidig fejlhåndtering

golang.org/x/sync/errgroup i praksis

Lektion 2 af 413 trin

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 fejl
  • g.Wait() — blokerer, indtil alle er færdige; returnerer den første fejl
  • WithContext — context annulleres ved den første fejl
  • g.SetLimit(n) — begrænser samtidige goroutiner (Go 1.20+)
Gratis at komme i gang

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

  1. Pipeline- og stage-mønstre
  2. errgroup til samtidig fejlhåndtering
  3. Semaphore-mønsteret
  4. Detektering af leaks og annullering
← Tilbage til Go Academy