标准答案

  1. 入口根据请求或任务创建 context,并通过 WithCancel、WithTimeout 或 WithDeadline 派生子 context。
  2. 下游 select 监听 Done,收到取消后停止新工作、释放资源并返回 ctx.Err。
  3. context value 只保存小而稳定的请求范围信息,不应放大对象、数据库连接或可变配置。
  4. 创建的 cancel 必须调用,避免定时器和子 context 生命周期泄漏。

题目解析

context 用于传播取消、deadline 和少量请求范围值,子 context 的取消应沿调用链传递。它只能发出协作信号,goroutine 和阻塞库必须主动检查或使用支持 context 的 API。

WithCancel/WithTimeout 创建的 cancel 应在 owner 结束时调用,避免计时器和子节点长期存活。不要把 context 放进长期结构体或当作可变业务状态。

结果发送也要选择可取消路径:收到取消后不能无条件向无人接收的 channel 写入。后台任务需要脱离请求 context 时,应建立独立且有期限的任务状态。

常见误区

  • 误区:把 context 存到结构体作为长期字段。改正:沿方法参数显式传递,长期配置和业务状态单独保存。
  • 误区:忘记 defer cancel。改正:创建派生 context 的函数负责调用 cancel,并在测试中验证释放。
  • 误区:取消后仍向结果 channel 无条件发送。改正:发送时同时监听 ctx.Done,并保证消费者退出路径。

作者信息