Overview

context包定义了context类型,进程之间携带截止日期、取消信号和跨API边界和进程之间的其他请求范围的值。

传入请求对于一个服务应该创建context,外部调用对于服务讲接收一个context。它们之间的函数调用链必须传播上下文,可选地将其替换为使用WithCancel、WithDeadline、WithTimeout或WithValue创建的派生上下文。当上下文被取消时,所有从它派生的上下文也被取消。WithCancel, WithDeadline和WithTimeout函数接受一个Context(父),并返回一个派生的Context(子)和一个CancelFunc。调用CancelFunc将取消子进程及其子进程,删除父进程对子进程的引用,并停止任何关联的计时器。如果调用CancelFunc失败,就会泄漏子进程及其子进程,直到父进程被取消或计时器触发。go vet工具检查CancelFuncs是否用于所有控制流路径。

使用context的程序应该遵循这些规则,以保持包之间的接口一致,并允许静态分析工具检查上下文传播:

不要在结构类型中存储context;相反,将Context显式传递给每个需要它的函数。Context应该是第一个参数,通常命名为ctx:

  1. func DoSomething(ctx context.Context, arg Arg) error {
  2. // ... use ctx ...
  3. }

不要传递nil Context,即使函数允许它。如果您不确定使用哪个上下文,则执行context.TODO。

仅对传输流程和api的请求范围的数据使用context Values,不用于向函数传递可选参数。

相同的Context可以传递给运行在不同goroutine中的函数 ; 上下文对于多个goroutine同时使用是安全的。

请参阅https://blog.golang.org/context,以获得使用上下文的服务器的示例代码。