WithDeadline e WithValue
Defina prazos absolutos e passe valores no escopo da requisição
WithDeadline e WithValue é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 3 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.WithDeadline
WithDeadline cria um contexto que é cancelado em um horário absoluto. Se o pai já tiver um prazo anterior, o prazo do pai terá precedência.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout versus WithDeadline
WithTimeout(parent, d) equivale a WithDeadline(parent, time.Now().Add(d)). Utilize WithDeadline quando tiver uma expiração absoluta (por exemplo, proveniente de um cabeçalho RPC recebido).
Lendo o prazo limite
Inspecione o prazo limite de qualquer contexto com ctx.Deadline(). O booleano indica se existe um prazo limite.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue associa um par chave-valor ao contexto. O código subsequente o recupera com ctx.Value(key).
type ctxKey string
const userKey ctxKey = "user"
ctx := context.WithValue(parent, userKey, currentUser)
func getUser(ctx context.Context) *User {
u, _ := ctx.Value(userKey).(*User)
return u
}Prevenção de colisões de chaves
Utilize um tipo não exportado e específico do pacote para as chaves, a fim de evitar colisões entre pacotes. Nunca use diretamente tipos integrados (string, int) como chaves de contexto.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)O que armazenar no contexto
Armazene somente valores associados ao escopo da requisição que atravessem limites de API: identificadores de rastreamento, tokens de autenticação e identificadores de requisição. Não armazene argumentos opcionais de funções nem estado mutável.
Desempenho de WithValue
ctx.Value realiza uma busca linear na cadeia de contextos. Evite armazenar muitos valores por contexto; para vários valores, agrupe-os em uma única estrutura.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Propagando valores pela camada intermediária
A camada intermediária HTTP é o local canônico para associar metadados da requisição ao contexto e recuperá-los nos manipuladores:
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := authenticate(r)
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))
})
}r.WithContext
Substitua o contexto de uma requisição HTTP usando r.WithContext(ctx). Isso cria uma cópia superficial da requisição com o novo contexto, deixando o original inalterado.
Propagação do prazo limite
Quando um gateway define um prazo limite no contexto e encaminha a requisição para os serviços subsequentes, todos os serviços que aceitam o contexto respeitam automaticamente esse prazo, sem lógica explícita de tempo limite.
Cadeia de contextos
Cada WithValue, WithCancel e WithTimeout envolve o contexto pai em um novo nó. ctx.Value percorre a cadeia até encontrar a chave ou chegar a um contexto raiz que retorna nil.
Verificação rápida
Por que as chaves de contexto devem ser tipos não exportados e específicos do pacote?
Resumo: WithDeadline e WithValue
Pontos principais:
- WithDeadline cancela em um horário absoluto; WithTimeout é relativo
- ctx.Deadline() lê o prazo limite
- WithValue deve ser usado para metadados associados ao escopo da requisição; utilize chaves tipadas e não exportadas
- Agrupe vários valores em uma estrutura para reduzir a profundidade da cadeia
Perguntas Frequentes
A aula “WithDeadline e WithValue” é grátis?
Sim — o texto completo de “WithDeadline e WithValue” é 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 “WithDeadline e WithValue”?
Defina prazos absolutos e passe valores no escopo da requisição 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 3 de 4.
Quanto tempo leva a aula “WithDeadline e WithValue”?
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