0Pricing
Go Academy · Aula

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 goroutine

Detecçã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

  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