0Pricing
Go Academy · Aula

Por que context.Context existe

Cancelamento e gerenciamento do ciclo de vida das requisições

Por que context.Context existe é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 1 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 problema

Sem um mecanismo para cancelar trabalho em andamento, uma consulta lenta ao banco de dados ou uma chamada HTTP bloqueia a goroutine até sua conclusão, desperdiçando recursos quando a solicitação original já foi abandonada.

Visão geral de context.Context

context.Context é uma interface que transporta um sinal de cancelamento, um prazo opcional e metadados de chave e valor através dos limites das APIs e das goroutines.

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}

O canal Done

ctx.Done() retorna um canal que é fechado quando o contexto é cancelado ou atinge o tempo limite. As goroutines fazem select nele para detectar o cancelamento.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

context.Background()

context.Background() é o contexto raiz — nunca é cancelado, não tem prazo e não transporta valores. Use-o no início de uma solicitação, em main ou nos testes.

context.TODO()

context.TODO() também é um contexto raiz não cancelável, usado como marcador quando o contexto correto ainda não está disponível. Ele comunica a intenção aos revisores.

Por que passar Context como primeiro argumento?

Por convenção, o primeiro parâmetro de qualquer função que possa ser cancelada é ctx context.Context. Isso torna o cancelamento explícito e fácil de descobrir nas APIs.

func FetchUser(ctx context.Context, id int) (*User, error) {
    return db.QueryContext(ctx, "SELECT ...", id)
}

O cancelamento é propagado

Cancelar um contexto pai cancela todos os contextos filhos derivados. Isso permite que uma única chamada de cancelamento interrompa toda uma árvore de goroutines e operações.

O que Context não é

Context não é um recipiente genérico de valores — use-o apenas para dados com escopo da solicitação, como IDs de rastreamento ou tokens de autenticação, e não para parâmetros opcionais. Mantenha os valores em estruturas tipadas.

Integração com a biblioteca padrão

O cliente HTTP, o driver SQL, o gRPC e muitos pacotes de terceiros da biblioteca padrão aceitam um Context, permitindo que o cancelamento seja propagado por toda a pilha de chamadas.

Armazenamento de Context em uma estrutura

Não armazene um Context dentro de uma estrutura. Passe-o explicitamente como argumento de uma função. Armazená-lo torna o ciclo de vida do cancelamento opaco e frequentemente causa erros.

Context é imutável

Um Context é imutável — você deriva novos contextos envolvendo-o com WithCancel, WithDeadline, WithTimeout ou WithValue. O pai não é modificado.

Verificação rápida

O que ctx.Done() retorna?

Recapitulação: context.Context

Pontos-chave:

  • Transporta cancelamento, prazo e metadados entre goroutines
  • Passe-o como primeiro argumento; nunca o armazene em estruturas
  • O canal ctx.Done() é fechado ao cancelar ou atingir o tempo limite
  • O cancelamento é propagado do pai para todos os filhos

Perguntas Frequentes

A aula “Por que context.Context existe” é grátis?

Sim — o texto completo de “Por que context.Context existe” é 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 “Por que context.Context existe”?

Cancelamento e gerenciamento do ciclo de vida das requisições 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 1 de 4.

Quanto tempo leva a aula “Por que context.Context existe”?

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