Context
context:上下文,主要作用在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v等。
Context 的底层原理
-
接口
Contexttype Context interface { // 返回 context 是否会被取消或者自动取消的时间 Deadline() // 当 context 被取消或者到 deadline 时, 返回一个被关闭的 channel Done() // channel 关闭后,返回 context 取消的原因 Err() // 获取 key 对应的 value Value() }Canceler
type canceler interface { cancel() Done() }对于实现上面定义的两个方法的 context ,就表明时可取消的。
-
结构体
- emptyCtx:实现列 Context 接口,它是一个空context,永远不会被取消,没有存储值,没有 deadline
- cancelCtx:可以被取消
- timerCtx:超时会被取消
- valueCtx:可以存储k-v对
-
函数
- CancelFunc: 取消函数
- Background: 返回空的 context,常用于根 context
- TODO:返回空的 context,常用于重构时期,没有合适的 context 可用
- WithCancel: 基于父 context,生成一个可以取消的 context
- WithDeadline: 创建一个有 deadline 的 context
- WithTimeout: 创建一个有 timeout 的 context
- WithValue: 创建一个存储 k-v 的 context
Context 的使用陷阱
- 使用
WithCancel、WithCancelCause、WithTimeout和WithDeadline函数时,一定要调用cancel函数。 - 子
goroutine一定要设置正确的检查点,及时检查 Context 是否已被撤销或者超时。