内容目录
Go中Context
1. 什么是Context?
1.context是Go语言在1.7版本中引入的一个标准库的接口,提供了四种方法,定义如下:
type Context interface{
//Deadline方法的第一个返回值表述还有多久到期,第二个返回值代表是否被超时时间控制(有无截止时间)
Deadline() (deadline time.Time, ok bool)
//Done()返回一个只读channel,当这个channel被关闭时,说明这个context被取消
Done() <-chan struct{}
//Err()返回一个错误,表示channel被关闭的原因(例如:取消,超时关闭)
Err() error
//Value方法返回指定key对应的value,这是context携带的值
Value(key interface{}) interface{}
}
2.go语言中对context接口提供了四种基本类型实现:
有emptyCtx、cancelCtx、timerCtx、valueCtx四种实现
-
emptyCtx:emptyCtx 虽然实现了context接口,但是不具备任何功能,因为实现很简单,基本都是直接返回空值
- 我们一般调用context.Background ( ) 和context.TODO ( ) 都是返回一个 * emptyCtx的动态类型(通过静态类型context.Context传递)
-
cancelCtx:cancelCtx同时实现Context和canceler接口,通过取消函数cancelFunc实现退出通知。注意其退出通知机制不但通知自己,同时也通知其children节点。
- 我们一般调用context.WithCancel()就会返回一个* cancelCtx 和cancelFunc
-
timerCtx:timerCtx是一个实现了Context接口的具体类型,其内部封装了cancelCtx类型实例,同时也有个deadline变量,用来实现定时退出通知
- 我们一般调用context.WithTimeout ( ) 就会返回一个* timerCtx和cancelFunc,不仅可以定时通知,也可以调用cancelFunc进行通知
- 调用context.WithDeadline ( ) 也可以,WithTimeout是多少秒后进行通知
WithDeadline是在某个时间点通知,本质上,WithTimeout会转而WithDeadline
-
valueCtx:valueCtx是一个实现了Context接口的具体类型,其内部封装了Context接口类型,同时也封装了一个k/v的存储变量,其是一个实现了数据传递
- 我们一般context.WithValue ( ) 来得到一个*valueCtx,valueCtx可以继承它的parent valueCtx中的{key, value}
2. Context的使用场景和用途?
- context主要用来在goroutine 之间传递上下文信息,比如传递请求的trace_id,以便于追踪全局唯一请求。
- 另一个用处是可以用来做取消控制,通过取消信号和超时时间来控制子goroutine的退出,防止goroutine泄露。
包括:取消型号、超时时间、截止时间、k-v等。