[Go] Golang Context 包的注意点
Golang context 包,定义了context 类型,携带截止日期,取消信号,和其它跨API请求作用域及进程间的值。
到服务器的请求应该创建一个 Context,服务器对外的调用应该接受一个Context。
函数之间的调用链必须传递 Context,可选地可以用 WithCancel、WithDeadline、WithTimeout、WithValue 创建的派生 Context。
当一个 Context 取消了,所有的派生 Context 也同样被取消。
WithCancel, WithDeadline, WithTimeout 函数携带一个Context(父级)并且返回一个派生Context(子级)和一个 CancelFunc。
调用 CancelFunc 取消子级和子子级,移除父级到子级的引用,并停止任务相关的定时器。
无法调用 CancelFunc 让子级和子子级泄露,直到父级被取消或者定时器触发。Go vet 工具检测在所有控制流路径上使用的 CancelFuncs。
使用 Context 的程序应该按照这些规则来保持包之间的接口一致和支持静态分析工具检测Context传播:
1.不把 Context 存到一个结构类型中,而是明确传递到每个需要的方法中。Context 应该是第一个参数,一般命名成 ctx:
func DoSomething(ctx context.Context, arg Arg) error { // ... use ctx ... }
2.不要传一个 nil Context,即使函数允许。如果不确定使用哪一个 Context,传递一个 context.TODO
3.只对请求作用域的数据如 传输处理和APIs 使用 context 的值。不是作为可选参数传递给函数。
4. 同一个Context 可以传递给 运行在不同 goroutine 里的函数;Context 同时被多个 goroutine 使用是安全的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~