1. 介绍

文档地址:https://pkg.go.dev/context

Go 标准库 context 用于在函数调用、API调用、进程调用间传递上下文。

Go官方建议不要将 context 定义在其他结构体中,将 context 作为独立的参数传递给需要的函数且应该是首个参数,变量名一般使用 ctx。示例如下:

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

context 在多个协程中同时使用是安全的。

2. 类型

2.1 Context

类型定义:

// Context 上下文
type Context interface {
	Deadline() (deadline time.Time, ok bool) // 被取消的时间
	Done() <-chan struct{} // 返回一个通道,context被取消时关闭
	Err() error // Done未关闭时返回nil,关闭时返回关闭原因
	Value(key any) any // 获取key对应的val
}

方法:

// Background 返回一个空的context,不会被取消,没有值,没有deadline,通常用于主函数、初始化、测试、最上层接收请求时
func Background() Context

// TODO 返回一个空的context,不确定会用到context时使用
func TODO() Context

// WithValue 返回父context的复制,并关联key-val
func WithValue(parent Context, key, val any) Context

2.2 CancelCauseFunc

类型定义:

type CancelCauseFunc func(cause error)

2.3 CancelFunc

类型定义:

type CancelFunc func()

3. 函数

// Cause 返回解释为什么context被取消
func Cause(c Context) error

// WithCancel 返回一个父context的复制,父context取消或者cancel被调用都会取消当前context
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithCancelCause(parent Context) (ctx Context, cancel CancelCauseFunc)

// WithTimeout 带有过期时间
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)