---
id: daily-golang-context
name: "golang-context"
url: https://skills.yangsir.net/skill/daily-golang-context
author: samber
domain: ai-backend-engineering
tags: ["concurrency", "backend-development", "timeout-handling", "cancellation", "goroutine-management"]
install_count: 32700
rating: 4.60 (34 reviews)
github: https://github.com/samber/cc-skills-golang
---

# golang-context

> 规范使用 Go context.Context 传播取消信号、超时和请求范围值，避免 Goroutine 泄漏和资源未释放

**Stats**: 32,700 installs · 4.6/5 (34 reviews)

## Before / After 对比

### Context 使用规范

**Before**:

手动管理 context 传递容易遗漏取消检查，导致后台 Goroutine 无法退出，一个 HTTP 服务端点可能泄漏数百个 Goroutine，排查需要数小时

**After**:

自动生成正确的 context 传播和取消处理代码，确保超时后所有资源及时释放，10 分钟修复整个服务的泄漏问题

| Metric | Before | After | Change |
|---|---|---|---|
| 修复时间 | 120分钟 | 10分钟 | -92% |

## Readme

# 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

- The same context MUST be propagated through the entire request lifecycle: HTTP handler → service → DB → external APIs

- `ctx` MUST be the first parameter, named `ctx context.Context`

- NEVER store context in a struct — pass explicitly through function parameters

- NEVER pass `nil` context — use `context.TODO()` if unsure

- `cancel()` MUST always be deferred immediately after `WithCancel`/`WithTimeout`/`WithDeadline`

- `context.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](https://github.com/samber/cc-skills-golang/blob/HEAD/skills/golang-context/./references/cancellation.md)** — 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](https://github.com/samber/cc-skills-golang/blob/HEAD/skills/golang-context/./references/values-tracing.md)** — 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](https://github.com/samber/cc-skills-golang/blob/HEAD/skills/golang-context/./references/http-services.md)** — 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-linter` skill for configuration and usage.
Weekly Installs748Repository[samber/cc-skills-golang](https://github.com/samber/cc-skills-golang)GitHub Stars1.1KFirst SeenMar 22, 2026Security Audits[Gen Agent Trust HubPass](/samber/cc-skills-golang/golang-context/security/agent-trust-hub)[SocketPass](/samber/cc-skills-golang/golang-context/security/socket)[SnykPass](/samber/cc-skills-golang/golang-context/security/snyk)Installed onopencode712cursor706codex702gemini-cli700github-copilot699cline698

---
*Source: https://skills.yangsir.net/skill/daily-golang-context*
*Markdown mirror: https://skills.yangsir.net/api/skill/daily-golang-context/markdown*