learning_notes

学习笔记

View project on GitHub

Context

context 的核心作用

  • ​传递取消信号:允许父协程或调用链上游主动取消子任务(如超时、用户中断)。
  • ​设置截止时间(Deadline)​:为任务设置明确的超时时间。
  • ​传递请求作用域数据:在调用链中安全传递与请求相关的数据(如 TraceID、认证信息)。
  • ​控制协程生命周期:避免协程泄漏(Goroutine Leak)。

context.Value 的查找过程是怎样的

  • 因为查找方向是往上走的,所以,父节点没法获取子节点存储的值,子节点却可以获取父节点的值。
  • 用 Value 方法的时候要判断结果是否为 nil。

context.Value 的优缺点?

  • ​优点:跨层级传递数据无需修改函数签名。
  • ​缺点:
    • ​类型不安全:需要类型断言。
    • ​隐式依赖:数据来源不透明,增加维护成本。
    • ​建议:仅用于传递基础设施数据(如 TraceID),而非业务参数。

      如何避免 context 泄漏?

  • 始终调用 defer cancel() 确保资源释放。
  • 在子协程中监听 ctx.Done() 信号,及时退出。