Bonnes pratiques context.Context en Go

VérifiéSûr

Guide idiomatique de context.Context en Go : propagation, annulation, timeouts, valeurs de requête et context.WithoutCancel pour le travail en arrière-plan.

Spar Skills Guide Bot
DeveloppementIntermédiaire
21/10/2026
Claude CodeCursorWindsurfCopilotCodex
#golang#context#cancellation#concurrency#best-practices

Recommandé pour

Synthèse automatique

Ce skill décrit l’usage idiomatique de context.Context en Go : propagation dans les couches, annulation, délais et valeurs liées à la requête.

Points forts

  • Règles explicites sur la propagation du même contexte et sur ctx comme premier paramètre.
  • Couvre les cas avancés comme context.WithoutCancel, les clés de valeur non exportées et l’annulation par AfterFunc.
  • Tableau de décision pratique pour choisir Background, TODO, r.Context, WithCancel ou WithTimeout.
  • Périmètre bien délimité : le skill ne s’applique pas au code qui se contente d’accepter un ctx.

Limites

  • Se concentre uniquement sur context.Context, sans couvrir l’ensemble des patterns de concurrence ou de gestion d’erreurs en Go.
  • Les règles formulées en MUST peuvent être trop rigides pour du code hérité ou des cas particuliers.
  • Les détails les plus poussés renvoient à des fichiers de référence externes, donc le SKILL.md seul reste synthétique.
Quand l'utiliser

À utiliser lors de la conception ou de la revue d’une chaîne d’appels Go qui doit propager annulation, délais ou valeurs de requête.

Quand l'éviter

À éviter pour de simples fonctions qui reçoivent déjà un ctx sans question de propagation, d’annulation ou de valeur de contexte.

Analyse de sécurité

Sûr
Score qualité86/100

The skill is pure instructional documentation on idiomatic context.Context usage. It contains no executable payloads, no network calls, no obfuscation, no secret handling, and no destructive commands. Tool grants (Read/Edit/Write/Glob/Grep plus go/golangci-lint/git/Agent) are appropriately scoped for a Go development skill, and the text never instructs the agent to run shell commands or touch credentials. Only minor note is that Bash(go:*) can transitively run code, which is inherent to Go tooling rather than a red flag here.

Points d'attention
  • •Declared tool set includes Bash(go:*), which can indirectly execute arbitrary code (e.g., `go run`, `go generate`); this is a normal, narrow scope for a Go skill but worth noting
  • •Skill references bundled reference files (./references/*.md) that were not included in the provided content and therefore could not be reviewed
Comment cette analyse est faite

Exemples

Audit context propagation
Review this Go HTTP handler and service layer for context propagation issues. Point out any places where context.Background() or a new context breaks the request chain.
Choose cancellation strategy
My Go service leaks contexts after requests time out. Help me choose between context.WithTimeout, context.WithCancel, and context.WithoutCancel for cleanup and audit logging.
Store request IDs correctly
Is it appropriate to store a request ID in context.Context in Go? Show the idiomatic unexported key pattern and explain when values should be passed as parameters instead.

name: golang-context description: "Idiomatic context.Context usage in Golang — propagation through API boundaries, cancellation, timeouts and deadlines, request-scoped values, context.WithoutCancel for background work outliving requests. Apply when designing context propagation across layers, debugging leaked or unexpired contexts, choosing between context.Background/TODO/WithoutCancel, or storing values in context. Not for code that merely accepts ctx as first parameter." user-invocable: true license: MIT compatibility: Designed for Claude Code or similar AI coding agents, and for projects using Golang. metadata: author: samber version: "1.2.1" openclaw: emoji: "🔗" homepage: https://github.com/samber/cc-skills-golang requires: bins: - go install: [] allowed-tools: Read Edit Write Glob Grep Bash(go:) Bash(golangci-lint:) Bash(git:*) Agent

Community default. A company skill that explicitly supersedes samber/cc-skills-golang@golang-context skill takes precedence.

Go context.Context Best Practices

context.Context is Go's mechanism for propagating cancellation signals, deadlines, and request-scoped values across API boundaries and between goroutines. Think of it as the "session" of a request — it ties together every operation that belongs to the same unit of work.

Best Practices Summary

  1. The same context MUST be propagated through the entire request lifecycle: HTTP handler → service → DB → external APIs
  2. ctx MUST be the first parameter, named ctx context.Context
  3. NEVER store context in a struct — pass explicitly through function parameters
  4. NEVER pass nil context — use context.TODO() if unsure
  5. cancel() MUST be called on all control-flow paths for WithCancel/WithTimeout/WithDeadline, unless ownership of the context and cancel function is explicitly returned or transferred
  6. context.Background() MUST only be used at the top level (main, init, tests)
  7. Use context.TODO() as a placeholder when you know a context is needed but don't have one yet
  8. NEVER create a new context.Background() in the middle of a request path
  9. Context value keys MUST be unexported types to prevent collisions
  10. Context values MUST only carry request-scoped metadata — NEVER function parameters
  11. Use context.WithoutCancel (Go 1.21+) when spawning background work that must outlive the parent request

Creating Contexts

| Situation | Use | | --- | --- | | Entry point (main, init, test) | context.Background() | | Function needs context but caller doesn't provide one yet | context.TODO() | | Inside an HTTP handler | r.Context() | | Need cancellation control | context.WithCancel(parentCtx) | | Need a deadline/timeout | context.WithTimeout(parentCtx, duration) |

Context Propagation: The Core Principle

The most important rule: propagate the same context through the entire call chain. When you propagate correctly, cancelling the parent context cancels all downstream work automatically.

// ✗ Bad — creates a new context, breaking the chain
func (s *OrderService) Create(ctx context.Context, order Order) error {
    return s.db.ExecContext(context.Background(), "INSERT INTO orders ...", order.ID)
}

// ✓ Good — propagates the caller's context
func (s *OrderService) Create(ctx context.Context, order Order) error {
    return s.db.ExecContext(ctx, "INSERT INTO orders ...", order.ID)
}

Deep Dives

  • Cancellation, Timeouts & Deadlines — How cancellation propagates: WithCancel for manual cancellation, WithTimeout for automatic cancellation after a duration, WithDeadline for absolute time deadlines. Patterns for listening (<-ctx.Done()) in concurrent code, AfterFunc callbacks, and WithoutCancel for operations that must outlive their parent request (e.g., audit logs).

  • Context Values & Cross-Service Tracing — Safe context value patterns: unexported key types to prevent namespace collisions, when to use context values (request ID, user ID) vs function parameters. Trace context propagation: OpenTelemetry trace headers, correlation IDs for log aggregation, and marshaling/unmarshaling context across service boundaries.

  • Context in HTTP Servers & Service Calls — HTTP handler context: r.Context() for request-scoped cancellation, middleware integration, and propagating to services. HTTP client patterns: NewRequestWithContext, client timeouts, and retries with context awareness. Database operations: always use *Context variants (QueryContext, ExecContext) to respect deadlines.

Cross-References

  • → See the samber/cc-skills-golang@golang-concurrency skill for goroutine cancellation patterns using context
  • → See the samber/cc-skills-golang@golang-database skill for context-aware database operations (QueryContext, ExecContext)
  • → See the samber/cc-skills-golang@golang-observability skill for trace context propagation with OpenTelemetry
  • → See the samber/cc-skills-golang@golang-design-patterns skill for timeout and resilience patterns

Enforce with Linters

Many context pitfalls are caught automatically by linters: govet, staticcheck. → See the samber/cc-skills-golang@golang-lint skill for configuration and usage.

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/go-context-context-best-practices-mvda87ij' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/go-context-context-best-practices-mvda87ij/download' --output '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md.part' && mv '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md.part' '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Environnement déclaré par l’auteur : Designed for Claude Code or similar AI coding agents, and for projects using Golang.

Outils déclarés par l’auteur (à vérifier dans votre agent) : Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && test -s '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/golang-context' && cp -R '.skill-downloads/go-context-context-best-practices-mvda87ij' '.claude/skills/golang-context'

Cursor
test -f '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && test -s '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/golang-context' && cp -R '.skill-downloads/go-context-context-best-practices-mvda87ij' '.cursor/skills/golang-context'

Codex
test -f '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && test -s '.skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/golang-context' && cp -R '.skill-downloads/go-context-context-best-practices-mvda87ij' '.agents/skills/golang-context'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/go-context-context-best-practices-mvda87ij'

openskills read 'go-context-context-best-practices-mvda87ij'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/go-context-context-best-practices-mvda87ij/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires