0Pricing
Go Academy · Aula

errgroup para tratamento concorrente de errors

Use golang.org/x/sync/errgroup na prática

errgroup para tratamento concorrente de errors é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Problema com gorrotinas e erros

Iniciar gorrotinas com go func() descarta valores retornados, inclusive erros. É necessário usar mecanismos adicionais (canais, WaitGroup) para coletá-los. O errgroup simplifica isso.

golang.org/x/sync/errgroup

O errgroup.Group executa gorrotinas e coleta erros. Wait() bloqueia até que todas as gorrotinas terminem e retorna o primeiro erro diferente de 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 retorna um grupo e um contexto derivado. O contexto é cancelado quando a primeira gorrotina retorna um erro, interrompendo o trabalho restante.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

Coletando resultados juntamente com erros

O errgroup não coleta resultados, apenas erros. Capture os resultados em fatias pré-alocadas acessadas por índice para evitar sincronização:

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) limita o número de gorrotinas executadas simultaneamente — funciona como um semáforo embutido, sem a necessidade de um canal separado.

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) inicia a gorrotina apenas se o limite (definido por SetLimit) permitir. Retorna false se ela não for iniciada.

Apenas o primeiro erro é retornado

O errgroup retorna apenas o primeiro erro. Se precisar de todos os erros, colete-os em uma fatia protegida por mutex dentro de cada gorrotina.

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
})

Diferença em relação a sync.WaitGroup

WaitGroup acompanha a conclusão; o errgroup acompanha a conclusão E coleta erros. Prefira o errgroup quando qualquer falha de gorrotina precisar ser informada.

Propagação do cancelamento do contexto

Quando errgroup.WithContext é usado, o cancelamento do contexto derivado sinaliza para que todas as outras gorrotinas parem — com uma semântica semelhante à de cancelar no primeiro erro.

Testando código com errgroup

Nos testes, injete um contexto com WithTimeout para garantir que o grupo não seja executado indefinidamente caso uma gorrotina fique travada.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

Alternativa ao semáforo

Antes de SetLimit (Go < 1.20), use um canal com buffer como semáforo dentro de gorrotinas individuais para obter o mesmo efeito.

Verificação rápida

O que errgroup.WithContext retorna que um errgroup.Group comum não retorna?

Recapitulação: errgroup

Pontos principais:

  • g.Go(func() error) — inicia uma gorrotina e coleta o primeiro erro
  • g.Wait() — bloqueia até que tudo termine; retorna o primeiro erro
  • WithContext — contexto cancelado no primeiro erro
  • g.SetLimit(n) — limita as gorrotinas simultâneas (Go 1.20+)

Perguntas Frequentes

A aula “errgroup para tratamento concorrente de errors” é grátis?

Sim — o texto completo de “errgroup para tratamento concorrente de errors” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “errgroup para tratamento concorrente de errors”?

Use golang.org/x/sync/errgroup na prática Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “errgroup para tratamento concorrente de errors”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Padrões de pipeline e estágios
  2. errgroup para tratamento concorrente de errors
  3. Padrão de semáforo
  4. Detecção de vazamentos e cancelamento
← Voltar para Go Academy