上下文

context 包(在 Go 1.7 中)或 golang.org/x/net/context 包(Pre 1.7)是用于创建上下文的接口,该上下文可用于跨 API 边界和服务之间传送请求范围值和期限,以及所述接口的简单实现。

除此之外:上下文这个词被宽泛地用于指代整个树,或者指树中的单个叶子,例如。实际的 context.Context 值。

在高层次上,上下文是树。构造它们时会向树中添加新叶子(具有父值的 context.Context),并且永远不会从树中删除叶子。任何上下文都可以访问其上方的所有值(数据访问仅向上流动),如果取消任何上下文,其子项也将被取消(取消信号向下传播)。取消信号通过一个函数实现,该函数返回一个在取消上下文时将被关闭(可读)的通道; 这使得上下文成为实现管道和取消并发模式或超时的非常有效的方式。

按照惯例,采用上下文的函数具有第一个参数 ctx context.Context。虽然这只是一个惯例,但应该遵循这个惯例,因为许多静态分析工具专门寻找这个参数。由于 Context 是一个接口,因此也可以将现有的类上下文数据(在整个请求调用链中传递的值)转换为普通的 Go 上下文,并通过实现一些方法以向后兼容的方式使用它们。此外,上下文对于并发访问是安全的,因此你可以从许多 goroutine(无论它们是在并行线程上运行还是作为并发协同程序)使用它们而不用担心。

进一步阅读