golang-context

von samber

Idiomatische Verwendung von context.Context in Golang — Propagation durch API-Grenzen, Abbruch, Timeouts und Deadlines, anfragenspezifische Werte, context.WithoutCancel für Hintergrundarbeiten, die Anfragen überdauern. Anwendbar beim Entwurf der Kontextpropagation über Schichten hinweg, beim Debuggen von verlorenen oder nicht abgelaufenen Kontexten, bei der Wahl zwischen context.Background/TODO/WithoutCancel oder beim Speichern von Werten im Kontext. Nicht für Code, der lediglich ctx als ersten Parameter akzeptiert.

npx skills add https://github.com/samber/cc-skills-golang --skill golang-context

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

SituationUse
Entry point (main, init, test)context.Background()
Function needs context but caller doesn't provide one yetcontext.TODO()
Inside an HTTP handlerr.Context()
Need cancellation controlcontext.WithCancel(parentCtx)
Need a deadline/timeoutcontext.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.

Mehr Skills von samber

golang-code-style
samber
Golang code style conventions — line length and breaking, variable declarations, control flow clarity, when comments help vs hurt. Use when writing or reviewing Go code, asking about style or clarity, or establishing project coding standards. Not for naming conventions (→ See `samber/cc-skills-golang@golang-naming` skill), linter configuration (→ See `samber/cc-skills-golang@golang-lint` skill), or doc comments (→ See `samber/cc-skills-golang@golang-documentation` skill).
developmentcode-review
golang-testing
samber
We need to translate the given text from English to German. The text is a description of a skill for Go testing. We must preserve the name "golang-testing" but it's not in the text, so we don't include it. Also preserve technical terms like "table-driven tests", "testify suites", "mocks", "parallel tests", "fuzzing", "fixtures", "goroutine leak detection", "goleak", "snapshot testing", "code coverage", "integration tests", "idiomatic test naming", "Go test CI", "flaky/slow tests", "testify-specific APIs", "samber/cc-skills-golang@golang-stretchr-testify", "measurement methodology". Also preserve URLs? None. Numbers? None. Technical terms should be kept as is or translated if common? For example, "table-driven tests" is often kept as "table-driven tests" in German tech context, but could be "tabellengesteuerte Tests". However, the instruction says "Preserve product names, protocol names
developmenttestingcode-review
golang-design-patterns
samber
Idiomatische Golang-Entwurfsmuster — funktionale Optionen, Konstruktoren, Fehlerfluss und -weitergabe, Ressourcenverwaltung und Lebenszyklus, Graceful Shutdown, Resilienz, Architektur, Dependency Injection, Datenverarbeitung, Streaming und mehr. Anwenden, wenn explizit zwischen Architekturmustern gewählt wird, funktionale Optionen implementiert werden, Konstruktor-APIs entworfen werden, Graceful Shutdown eingerichtet wird, Resilienzmuster angewendet werden oder gefragt wird, welches idiomatische Go-Muster zu einem spezifischen Problem passt.
developmentdesigncode-review
golang-error-handling
samber
We need to translate the given text from English to German, preserving the name "golang-error-handling" but not including it unless it appears in the source. The source text does not include the name, so we don't include it. We must preserve product names, protocol names, URLs, numbers, technical terms. The text includes terms like "Golang", "error handling", "%w", "errors.Is/As", "errors.Join", "panic/recover", "slog", "samber/oops", "samber/cc-skills-golang@golang-samber-oops". These should remain as is. Also "HTTP", "log aggregation", "3rd-party tools". Translate the rest idiomatically. The text: "Idiomatic Golang error handling — creation, wrapping with %w, errors.Is/As, errors.Join, custom error types, sentinel errors, panic/recover, the single handling rule, structured logging with slog, HTTP request logging middleware, and samber/oops for production errors. Built to make logs usable at scale with log
developmentcode-review
golang-performance
samber
Golang-Leistungsoptimierungsmuster und Methodik – bei X-Engpass wird Y angewendet. Behandelt Allokationsreduzierung, CPU-Effizienz, Speicherlayout, GC-Tuning, Pooling, Caching und Hot-Path-Optimierung. Verwenden, wenn Profiling oder Benchmarks einen Engpass identifiziert haben und das richtige Optimierungsmuster zur Behebung benötigt wird. Auch verwenden bei der Durchführung von Performance-Code-Reviews, um Verbesserungen oder Benchmarks vorzuschlagen, die helfen könnten, schnelle Leistungssteigerungen zu identifizieren. Nicht für Messmethodik (→...
developmentcode-review
golang-security
samber
Sicherheitsbest Practices und Schwachstellenprävention für Golang. Behandelt Injection (SQL, Command, XSS), Kryptografie, Dateisystemsicherheit, Netzwerksicherheit, Cookies, Secrets-Management, Speichersicherheit und Logging. Anwenden beim Schreiben, Überprüfen oder Auditieren von Go-Code auf Sicherheit oder bei der Arbeit an risikobehaftetem Code mit Krypto, I/O, Secrets-Management, Benutzereingaben oder Authentifizierung. Enthält Konfiguration von Sicherheitstools.
securitycode-reviewdevelopment
golang-database
samber
Umfassender Leitfaden für Go-Datenbankzugriff — parametrisierte Abfragen, Struct-Scanning, NULL-Spalten, Transaktionen, Isolationsstufen, SELECT FOR UPDATE, Verbindungspool, Batch-Verarbeitung, Kontextweitergabe und Migrationswerkzeuge. Verwenden beim Schreiben, Überprüfen oder Debuggen von Golang-Code, der mit PostgreSQL, MariaDB, MySQL oder SQLite interagiert; für Datenbanktests; oder bei Fragen zu database/sql, sqlx oder pgx. Erzeugt KEINE Datenbankschemata oder Migrations-SQL.
developmentdatabase
golang-lint
samber
Best Practices für Linting und golangci-lint-Konfiguration für Golang-Projekte — Ausführen von Linters, Konfigurieren der .golangci.yml, Unterdrücken von Warnungen mit nolint-Direktiven, Interpretieren von Lint-Ausgaben und Auswählen von Linters. Verwenden bei der Konfiguration von golangci-lint, bei Fragen zu Lint-Warnungen oder nolint-Unterdrückungen, beim Einrichten von Code-Qualitätswerkzeugen oder bei der Auswahl von Linters. Auch verwenden, wenn der Benutzer golangci-lint, go vet, staticcheck oder revive erwähnt.
developmentcode-reviewtesting