年轻人不要总熬夜

golang 部分tips 记录

Posted on By jax777

context 上下文

golang 的 Context包,跨api边界和进程携带请求域的数据、取消信号、截止时间等相关操作。

对服务器的传入请求应创建一个Context,对服务器的传出调用应接受一个Context。它们之间的函数调用链必须传递Context,可选地将其替换为使用WithCancel,WithDeadline,WithTimeout或WithValue创建的派生Context。取消 Context 后,也会取消从中派生的所有Contexts 。

WithCancel,WithDeadline和WithTimeout函数接受Context(父)并返回派生的Context(子)和CancelFunc。调用CancelFunc会取消子项及其子项,删除父项对子项的引用,并停止任何关联的计时器。未能调用CancelFunc会泄漏子项及其子项,直到取消父项或计时器触发。 go vet工具检查CancelFuncs是否在所有控制流路径上使用。

使用 Contexts 的程序应遵循这些规则,以使各接口之间的接口保持一致,并启用静态分析工具来检查上下文传播:不要将上下文存储在结构类型中;相反,将Context明确传递给需要它的每个函数。 Context应该是第一个参数,通常命名为ctx:

结构

type Context interface {

Deadline() (deadline time.Time, ok bool)

Done() <-chan struct{}

Err() error

Value(key interface{}) interface{}

}