Context

Context 用于定义 goroutine 中的上下文信息, 常用于以下几种情况:

  • 数据传递: 在多个 goroutine 中传递数据

  • 超时管理: 通过配置超时时间,可以方便地配置协程的终止时间

  • 终止协程: 通过使用 cancel() 方法,协程可以很方便地终止,可以批量管理多个协程的终止

type Context interface {

    Done() <-chan struct{}

    Deadline() (deadline time.Time, ok bool)
    
    Err() error
    
    Value(key interface{}) interface{}
}

根节点和派生节点

我们可以为 context 创建根节点和派生节点,为树形结构,当根节点被 cancel() 或超时终止时,它的所有派生节点也会被终止,根节点的数据也会被所有派生节点共享。

context 结构

创建根节点

创建派生节点

使用 context.WithXXX() 创建派生 context

WithValue()

context.WithValue() 可以用于创建派生节点并添加键值数据,同时保留父级 context 所有的数据

WithDeadline() WithTimeout()

context.WithDeadline()context.WithTimeout() 可以用来创建带有超时控制的 context

注意

WithTimeout(1*time.Second) 等同于 WithDeadline(time.Now().Add(1*time.Second))

WithCancel()

使用 WithCancel() 可以创建手动终止的 context 执行 cancel() 即可手动终止

最后更新于