
Golang Context Best Practices
FreeMaster context propagation in Go applications.
Free · Opens the source repo
What Golang Context Best Practices does
The Golang Context Best Practices skill provides developers with essential guidelines for effectively using context.Context in Go applications. This skill is particularly relevant for those working with APIs, where managing cancellation signals, deadlines, and request-scoped values is crucial for building robust and responsive services. By adhering to the best practices outlined in this skill, developers can ensure that their applications handle context correctly across various layers, from HTTP handlers to database operations.
The skill emphasizes the importance of propagating the same context throughout the entire request lifecycle, which is key to maintaining control over cancellation and timeouts. It guides users on how to properly create and manage contexts, such as using context.Background() at the entry point of an application and context.TODO() when a context is needed but not yet available. Furthermore, it highlights common pitfalls to avoid, such as passing nil contexts or creating new contexts in the middle of a request path, which can lead to unexpected behavior.
Additionally, the skill includes deep dives into specific topics like cancellation patterns, context values, and HTTP service contexts. These resources provide practical examples and patterns for implementing context effectively, ensuring that developers can easily integrate these practices into their codebases. Overall, this skill is designed for Go developers seeking to improve their understanding of context management and enhance the reliability of their applications.
When to use it
Use this skill when designing context propagation across layers, debugging context-related issues, or implementing request-scoped values in your Go applications.
When not to use it
This skill is not intended for code that simply accepts a context as a parameter without further context management or propagation.
What you can build with it
API Development
When developing APIs, use this skill to ensure proper context propagation across handlers, services, and databases.
Debugging Context Issues
Utilize this skill to identify and resolve context-related issues, such as leaked contexts or unexpired cancellations.
Implementing Request-Scoped Values
Apply the guidelines from this skill to effectively manage request-scoped values using context in your Go applications.
How to install Golang Context Best Practices
View source1. Install with the skills CLI
npx skills add samber/cc-skills-golang/golang-context --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by samberCommunity default. A company skill that explicitly supersedes
samber/cc-skills-golang@golang-contextskill 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
- The same context MUST be propagated through the entire request lifecycle: HTTP handler → service → DB → external APIs
ctxMUST be the first parameter, namedctx context.Context- NEVER store context in a struct — pass explicitly through function parameters
- NEVER pass
nilcontext — usecontext.TODO()if unsure cancel()MUST be called on all control-flow paths forWithCancel/WithTimeout/WithDeadline, unless ownership of the context and cancel function is explicitly returned or transferredcontext.Background()MUST only be used at the top level (main, init, tests)- Use
context.TODO()as a placeholder when you know a context is needed but don't have one yet - NEVER create a new
context.Background()in the middle of a request path - Context value keys MUST be unexported types to prevent collisions
- Context values MUST only carry request-scoped metadata — NEVER function parameters
- 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:
WithCancelfor manual cancellation,WithTimeoutfor automatic cancellation after a duration,WithDeadlinefor absolute time deadlines. Patterns for listening (<-ctx.Done()) in concurrent code,AfterFunccallbacks, andWithoutCancelfor 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*Contextvariants (QueryContext,ExecContext) to respect deadlines.
Cross-References
- → See the
samber/cc-skills-golang@golang-concurrencyskill for goroutine cancellation patterns using context - → See the
samber/cc-skills-golang@golang-databaseskill for context-aware database operations (QueryContext, ExecContext) - → See the
samber/cc-skills-golang@golang-observabilityskill for trace context propagation with OpenTelemetry - → See the
samber/cc-skills-golang@golang-design-patternsskill 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.
Frequently asked questions about Golang Context Best Practices
Similar skills
Python PyPI Package Builder
Streamline the process of creating and publishing Python packages.
Minecraft Plugin Development
Streamline your Minecraft server plugin creation.
MCP Server Builder
Easily build .NET MCP servers with the latest standards.
CommunityToolkit.Mvvm Messenger
Decoupled communication for ViewModels in .NET applications.
MVVM Toolkit DI
Streamline ViewModel integration with Dependency Injection in .NET.
MCP Apps Builder
Essential guidelines for MCP server development.
