context
context 用于在跨 goroutine、跨函数调用的请求链路中传递取消信号、截止时间与请求范围数据。它是网络服务中控制请求生命周期的标准设施,几乎所有涉及 I/O 的标准库与第三方库(net/http、database/sql 等)都接受 context 参数。
基本用法
context.Context 是一个接口,通过根 context 派生子 context 形成树状结构,父节点取消时所有子节点随之取消:
超时控制
Tip
两条铁律:
- 所有耗时函数的第一个参数应是
ctx context.Context(标准库惯例)。 - 派生 context 后必须
defer cancel(),避免资源泄漏,即便超时会自动触发取消。
context 的取消是协作式的:只有函数主动检查 ctx.Done() 才会提前退出,长循环中应定期检查。
手动取消
需要 import "time" 配合上例运行。
传递请求范围数据
WithValue 用于携带跨层请求元数据(如请求 ID、认证信息):
Warning
WithValue 不应替代函数参数传递业务数据。仅用于横切关注点(日志、链路追踪、认证);键必须使用自定义类型,取值时做类型断言。
在标准库中的集成
HTTP 服务端会自动为每个请求生成带超时的 context,客户端与服务端均可利用它控制 I/O 生命周期:
详见 REST 客户端章节。
小结
- context 树状传播取消信号,是请求生命周期的统一载体。
WithTimeout+defer cancel()是超时控制的标准组合。- 取消是协作式的,耗时逻辑需主动监听
ctx.Done()。