官方文档:https://pkg.go.dev/context
context携带跨 API 边界和进程之间的截止日期、取消信号和其他请求范围的值。
函数调用链传Context,可以选择将其替换为使用 WithCancel、WithDeadline、WithTimeout 或 WithValue 创建的派生 Context。当一个 Context 被取消时,从它派生的所有 Context 也会被取消。
WithCancel、WithDeadline 和 WithTimeout 函数采用 Context(父级)并返回派生的 Context(子级)和 CancelFunc。调用 CancelFunc 会取消子级及其子级,删除父级对子级的引用,并停止任何关联的计时器。未能调用 CancelFunc 会泄漏子级及其子级,直到父级被取消或计时器触发。
WithCancelCause 函数返回一个 CancelCauseFunc,它接受一个错误并将其记录为取消原因。在已取消的上下文或其任何子上下文上调用 Cause 可检索原因。如果未指定原因,Cause(ctx) 返回与 ctx.Err() 相同的值。
使用上下文的程序应遵循以下规则
- 不要将上下文存储在结构类型中;相反,将 Context 显式传递给每个需要它的函数。 Context 应该是第一个参数,通常命名为 ctx:
func DoSomething(ctx context.Context, arg Arg) error {
// ... use ctx ...
}
- 即使函数允许,也不要传递 nil Context。如果您不确定要使用哪个 Context,请传递 context.TODO。
- 仅将context值用于传输进程和 API 的请求范围数据,而不是用于将可选参数传递给函数。
- 相同的 Context 可以传递给在不同 goroutine 中运行的函数;上下文对于多个 goroutine 同时使用是安全的。