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
- Padrões de pipeline e estágios
- errgroup para tratamento concorrente de errors
- Padrão de semáforo
- Detecção de vazamentos e cancelamento