0Pricing
Go Academy · Aula

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

  1. Por que context.Context existe
  2. WithCancel e WithTimeout
  3. WithDeadline e WithValue
  4. Contexto em chamadas HTTP e de banco de dados
← Voltar para Go Academy