摘自杰瑞 · 赫尔曼的《你好,多莉》歌曲: 虽然人生在世有种种不如意,但你仍可以在幸福与不幸中做选择。 —王小波-

Go中Context

内容目录

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四种实现

  1. emptyCtx:emptyCtx 虽然实现了context接口,但是不具备任何功能,因为实现很简单,基本都是直接返回空值

    • 我们一般调用context.Background ( ) 和context.TODO ( ) 都是返回一个 * emptyCtx的动态类型(通过静态类型context.Context传递)
  2. cancelCtx:cancelCtx同时实现Context和canceler接口,通过取消函数cancelFunc实现退出通知。注意其退出通知机制不但通知自己,同时也通知其children节点。

    • 我们一般调用context.WithCancel()就会返回一个* cancelCtx 和cancelFunc
  3. timerCtx:timerCtx是一个实现了Context接口的具体类型,其内部封装了cancelCtx类型实例,同时也有个deadline变量,用来实现定时退出通知

    • 我们一般调用context.WithTimeout ( ) 就会返回一个* timerCtx和cancelFunc,不仅可以定时通知,也可以调用cancelFunc进行通知
    • 调用context.WithDeadline ( ) 也可以,WithTimeout是多少秒后进行通知
      WithDeadline是在某个时间点通知,本质上,WithTimeout会转而WithDeadline
  4. valueCtx:valueCtx是一个实现了Context接口的具体类型,其内部封装了Context接口类型,同时也封装了一个k/v的存储变量,其是一个实现了数据传递

    • 我们一般context.WithValue ( ) 来得到一个*valueCtx,valueCtx可以继承它的parent valueCtx中的{key, value}

2. Context的使用场景和用途?

  1. context主要用来在goroutine 之间传递上下文信息,比如传递请求的trace_id,以便于追踪全局唯一请求。
  2. 另一个用处是可以用来做取消控制,通过取消信号和超时时间来控制子goroutine的退出,防止goroutine泄露。

包括:取消型号、超时时间、截止时间、k-v等。

发表评论