Go Context 上下文
超时控制、取消信号、传递请求范围数据 · 难度:高级 · +20XP
Context — 并发控制利器
context.Context 在 goroutine 间传递取消信号、超时、截止时间和请求范围的值。HTTP 服务器、数据库调用、微服务间通信都依赖它。
创建 Context
ctx := context.Background() // 根 context(通常用于 main/init)
ctx := context.TODO() // 不确定用什么时先用着
// 带取消
ctx, cancel := context.WithCancel(ctx)
defer cancel() // 确保资源释放
// 带超时
ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
// 带截止时间
ctx, cancel := context.WithDeadline(ctx, time.Now().Add(5*time.Second))
检查取消
select {
case <-ctx.Done():
return ctx.Err() // "context canceled" 或 "context deadline exceeded"
default:
// 继续工作
}
传递值
ctx = context.WithValue(ctx, "userID", 42)
userID := ctx.Value("userID").(int) // 类型断言
⚠️ 只用于传递请求范围的数据(如 trace ID),不要用来传业务参数。