context 主要用来在 goroutine 之间传递上下文信息,包括:
- 取消信号
- 超时时间
- 截止时间
- 传值
原理:
contex接口
Go 里并没有直接为我们提供一个统一的 context 对象,而是设计了一个接口类型的 Context。然后在接口上来实现了几种具体类型的context
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}
接口核心API四个方法:
- Deadline() :返回过期时间,如果ok为false,说明没有设置过期时间。不常用
- Done():返回一个channel,而且它的数据类型是 struct{},一个空结构体,因此在 Go 里都是直接通过 close channel 来进行通知的,不会涉及具体数据传输。一般用于监听Context实例的信号,比如说过期,或者正常关闭。常用
- Err():返回一个错误用于表达Context发生了什么。如果上面的 Done() 的 channel 没被 close,则 error 为 nil;如果 channel 已被 close,则 error 将会返回 close 的原因,比如超时或手动取消。Canceled=>正常关闭,DeadlineExceeded=>过期超时。比较常用。
- Value():是用来存储具体数据的方法,取值。非常常用