context 包是 Go 并发编程中最常用的标准库之一。它提供了一种在 goroutine 之间传递截止时间、取消信号和请求范围数据的方式。
Context 的核心方法
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
- Deadline:返回 Context 的截止时间和是否有截止时间。
- Done:返回一个 channel,Context 被取消时关闭。
- Err:Context 被取消的原因(Canceled 或 DeadlineExceeded)。
- Value:获取 Context 中存储的键值。
四种创建方式
- context.Background():根 Context,通常在 main 函数和初始化中使用。
- context.TODO():占位符,表示尚未确定使用哪种 Context。
- context.WithCancel():可手动取消的 Context。
- context.WithTimeout/WithDeadline():带超时的 Context。
最佳实践
- Context 作为函数的第一个参数,命名为 ctx。
- 不要将 Context 存储在结构体中,应该显式传递。
- Context 的 Value 只用于请求范围的元数据,不要用于传递函数参数。
- 始终检查 ctx.Done() 以支持优雅取消。
Context 是请求生命周期的纽带——贯穿链路追踪、超时控制与取消传播。