WithCancel e WithTimeout
Crie contextos canceláveis e com limite de tempo
WithCancel e WithTimeout é 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.
context.WithCancel
WithCancel deriva um novo contexto com uma função de cancelamento. Chamar cancel fecha o canal Done do contexto derivado e de todos os seus filhos.
ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)Use sempre defer cancel
Não chamar cancel causa o vazamento da goroutine que monitora o contexto pai. Use sempre defer cancel imediatamente após criar um contexto cancelável.
context.WithTimeout
WithTimeout deriva um contexto que é cancelado automaticamente após a duração informada. É um wrapper conveniente para WithDeadline.
ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
// err may be context.DeadlineExceeded
}Verificação de Err()
Depois que Done é fechado, ctx.Err() retorna o motivo: context.Canceled (cancelado explicitamente) ou context.DeadlineExceeded (tempo limite excedido).
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
log.Println("timeout")
}Cancelamento a partir de outra goroutine
A função de cancelamento pode ser chamada com segurança de qualquer goroutine e simultaneamente de várias goroutines. Somente a primeira chamada tem efeito.
ctx, cancel := context.WithCancel(context.Background())
go func() {
if detectError() { cancel() }
}()Tempo limite da solicitação HTTP
Defina um tempo limite por solicitação com WithTimeout no contexto da solicitação recebida:
func handler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
result, err := service.Call(ctx)
// ...
}Cancelamento em cascata
Se um contexto pai for cancelado, todos os contextos derivados (filhos e netos) serão cancelados automaticamente, interrompendo todas as goroutines na árvore de chamadas.
Contexto nos testes
Use context.Background() ou context.WithTimeout nos testes para garantir que as goroutines iniciadas pelos testes tenham um limite de tempo.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)Propagação do contexto pelas bibliotecas
Sempre passe às chamadas de saída o contexto recebido (consultas ao banco de dados, chamadas HTTP, RPCs). Nunca o descarte nem o substitua, a menos que tenha um motivo específico para redefinir o prazo.
Criação de um contexto para um trabalho em segundo plano
Para trabalhos em segundo plano que não estejam vinculados a uma solicitação, use context.Background() como raiz e adicione um WithCancel para que o trabalho possa ser interrompido corretamente.
select com Done
Sempre faça select em ctx.Done() juntamente com o canal de trabalho para evitar bloqueios quando o contexto for cancelado antes da conclusão do trabalho.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}Verificação rápida
Qual é a diferença entre context.WithCancel e context.WithTimeout?
Recapitulação: WithCancel e WithTimeout
Pontos-chave:
- Use sempre defer cancel() logo após a criação
- WithTimeout cancela automaticamente após a duração; retorna DeadlineExceeded
- ctx.Err() distingue Canceled de DeadlineExceeded
- O cancelamento é propagado para todos os contextos derivados
Aprenda Go com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 51
- Aulas
- 203
Perguntas Frequentes
A aula “WithCancel e WithTimeout” é grátis?
Sim — o texto completo de “WithCancel e WithTimeout” é 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 “WithCancel e WithTimeout”?
Crie contextos canceláveis e com limite de tempo 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 “WithCancel e WithTimeout”?
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
- Por que context.Context existe
- WithCancel e WithTimeout
- WithDeadline e WithValue
- Contexto em chamadas HTTP e de banco de dados