[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 使用是安全的。

 

Refer:Go SDK/src/context/context.go

Link:https://www.cnblogs.com/farwish/p/15840531.html

posted on   ercom  阅读(80)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~

统计

点击右上角即可分享
微信分享提示