New to Claude Skills? Learn how to install them →

samber on GitHub

Golang Context Best Practices

Free

Master context propagation in Go applications.

by samber2.9k stars on samber/cc-skills-golang
1 views
Updated Aug 1, 2026
Get this skill

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 source

1. Install with the skills CLI

npx skills add samber/cc-skills-golang/golang-context --agent claude-code

2. 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 samber

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.

Frequently asked questions about Golang Context Best Practices

Similar skills