What canceled my Go context?
2 months ago
- #Debugging
- #Go
- #Context
- Go 1.20 引入了 `WithCancelCause` 方法,Go 1.21 新增了 `WithTimeoutCause` 功能,允许为上下文取消附加具体原因
- 传统的上下文取消仅返回通用错误如 `context canceled` 或 `context deadline exceeded`,缺乏具体原因说明
- `WithCancelCause` 支持为上下文取消附加自定义错误,通过提供具体失败原因来提升调试效率
- `WithTimeoutCause` 在超时发生时附加自定义错误,但正常返回时的 `defer cancel()` 会丢弃自定义原因
- 采用 `WithCancelCause` 结合 `time.AfterFunc` 的手动计时器模式,可确保所有执行路径(包括正常完成)都保留自定义原因
- 对于需要检查 `DeadlineExceeded` 的场景,在 `WithTimeoutCause` 之上叠加 `WithCancelCause` 可同时保留自定义原因和截止时间语义
- 中间件可通过 `WithCancelCause` 记录具体的取消原因,显著提升客户端-服务端交互的可观测性
- 这些原因追踪 API 正在 Go 生态中被广泛采用,包括 `golang.org/x/sync/errgroup` 等库和 Kubernetes 等项目都已集成该功能