Detecção de vazamentos e cancelamento
Garanta que as goroutines sejam encerradas e evite vazamentos
Detecção de vazamentos e cancelamento é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 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.
O que é um vazamento de goroutine?
Um vazamento de goroutine ocorre quando uma goroutine é iniciada, mas nunca termina. As goroutines vazadas se acumulam com o tempo, consumindo memória de pilha e CPU até que o processo seja encerrado.
Vazamento comum: recebimento bloqueado no canal
Uma goroutine aguardando um recebimento em um canal que nunca recebe um valor fica bloqueada para sempre:
go func() {
v := <-ch // leaks if no sender and ch is never closed
use(v)
}()Vazamento comum: nenhum sinal de conclusão
Uma goroutine em um laço for sem condição de saída ou canal de conclusão é executada para sempre:
go func() {
for {
work()
// no exit condition — leaks
}
}()Detectando vazamentos com goleak
go.uber.org/goleak verifica se nenhuma goroutine vazou ao final de um teste:
func TestMyFunc(t *testing.T) {
defer goleak.VerifyNone(t)
myFunc() // should not leak goroutines
}O contexto como solução
A forma idiomática de interromper goroutines de longa duração é usar um contexto. Passe ctx para a goroutine e use select em ctx.Done().
go func(ctx context.Context) {
for {
select {
case work := <-workCh:
process(work)
case <-ctx.Done():
return // clean exit
}
}
}(ctx)Padrão do canal de conclusão
Para casos mais simples, sem contexto, use um canal de conclusão dedicado. Feche-o para transmitir o sinal de parada a todas as goroutines que fazem leituras nele.
done := make(chan struct{})
go func() {
select {
case v := <-data: use(v)
case <-done: return
}
}()
close(done) // stops goroutineDetecção com runtime
Imprima o número de goroutines para detectar o crescimento durante a execução:
fmt.Println("goroutines:", runtime.NumGoroutine())Goroutines do servidor HTTP
net/http gerencia automaticamente as goroutines de cada requisição e as limpa quando a requisição termina. No entanto, manipuladores que iniciam goroutines sem fazer a limpeza ainda podem causar vazamentos.
Testando a existência de vazamentos
Execute seu conjunto de testes com goleak como um TestMain ou com um defer por teste. Qualquer goroutine que não tenha terminado após o corpo do teste fará o teste falhar.
func TestMain(m *testing.M) {
goleak.VerifyTestMain(m)
}Vazamentos com Time.After
time.After em um select dentro de um laço cria um novo temporizador a cada iteração, que não pode ser coletado pelo GC até ser acionado. Substitua-o por time.NewTimer e Reset.
Vazamento causado por goroutine que retorna um erro
Se uma goroutine deveria enviar um resultado por um canal, mas retorna antecipadamente devido a um erro sem enviar nada, a goroutine consumidora fica bloqueada para sempre. Sempre envie algo ou feche o canal em todos os caminhos.
Verificação rápida
Qual é a forma mais idiomática de interromper uma goroutine de longa duração em Go?
Recapitulação: detecção de vazamentos e cancelamento
Pontos principais:
- Os vazamentos de goroutines se acumulam; monitore-os com runtime.NumGoroutine()
- O goleak detecta automaticamente vazamentos de goroutines nos testes
- Sempre forneça às goroutines um caminho de saída: contexto, canal de conclusão ou entrada fechada
- time.After em laços causa vazamento de temporizadores; use NewTimer+Reset
Perguntas Frequentes
A aula “Detecção de vazamentos e cancelamento” é grátis?
Sim — o texto completo de “Detecção de vazamentos e cancelamento” é 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 “Detecção de vazamentos e cancelamento”?
Garanta que as goroutines sejam encerradas e evite vazamentos 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 4 de 4.
Quanto tempo leva a aula “Detecção de vazamentos e cancelamento”?
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