极客时间《云原生架构与 GitOps 实战》学习笔记 Day 5

176 阅读1分钟

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四个方法:

  1. Deadline() :返回过期时间,如果ok为false,说明没有设置过期时间。不常用
  2. Done():返回一个channel,而且它的数据类型是 struct{},一个空结构体,因此在 Go 里都是直接通过 close channel 来进行通知的,不会涉及具体数据传输。一般用于监听Context实例的信号,比如说过期,或者正常关闭。常用
  3. Err():返回一个错误用于表达Context发生了什么。如果上面的 Done() 的 channel 没被 close,则 error 为 nil;如果 channel 已被 close,则 error 将会返回 close 的原因,比如超时或手动取消。Canceled=>正常关闭,DeadlineExceeded=>过期超时。比较常用。
  4. Value():是用来存储具体数据的方法,取值。非常常用