关于go-context包
思维导图
- 目的
- 为了在不同的 goroutine 之间或跨 API 边界传递超时、取消信号和其他请求范围内的值(与该请求相关的值。这些值可能包括用户身份信息、请求处理日志、跟踪信息等等)。
- 常用场景
- 数据操作
- 网络请求
- RPC操作
- context接口
- context 包在提供了一个用于跨 API 边界传递超时、取消信号和其他请求范围值的通用数据结构。
- 用于在多个 Goroutine 和函数之间传递请求范围内的信息。
- 核心方法:Deadline、Done、Err、Value
- 分解核心方法
- Deadline
- Deadline() (deadline time.Time, ok bool) 方法返回 Context 的截止时间,表示在这个时间点之后,Context 会被自动取消。
- 如果 Context 没有设置截止时间,该方法返回一个零值 time.Time 和一个布尔值 false。
- Done
- Done() 方法返回一个只读通道,当 Context 被取消时,该通道会被关闭。
- 你可以通过监听这个通道来检测 Context 是否被取消。如果 Context 永不取消,则返回 nil。
- Err
- Err() 方法返回一个 error 值,表示 Context 被取消时产生的错误。
- 如果 Context 尚未取消,该方法返回 nil。
- Value
- Value(key any) any 方法返回与 Context 关联的键值对,一般用于在 Goroutine 之间传递请求范围内的信息。
- 如果没有关联的值,则返回 nil。
- Deadline
- context创建的方式
- context.Background()
- 该函数返回一个非 nil 的空 Context,它没有携带任何的值,也没有取消和超时信号。通常作为根 Context 使用。
- context.todo()
- context.TODO() 函数返回一个非 nil 的空 Context,它没有携带任何的值,也没有取消和超时信号。
- 不确定上下文时使用
- context.withvalue()
- context.WithValue(parent Context, key, val any) 函数接收一个父 Context 和一个键值对 key、val,返回一个新的子 Context,并在其中添加一个 key-value 数据对。
- context.Witchcancle()
- context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) 函数接收一个父 Context,返回一个新的子 Context 和一个取消函数,当取消函数被调用时,子 Context 会被取消,同时会向子 Context 关联的 Done() 通道发送取消信号,届时其衍生的子孙 Context 都会被取消。
- 这个函数适用于手动取消操作的场景。
- context.withDeadline()
- context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) 函数接收一个父 Context 和一个截止时间作为参数,返回一个新的子 Context。当截止时间到达时,子 Context 其衍生的子孙 Context 会被自动取消。
- 这个函数适用于需要在特定时间点取消操作的场景。
- context.withTimeout()
- context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 函数和 context.WithDeadline() 函数的功能是一样的,其底层会调用 WithDeadline() 函数,只不过其第二个参数接收的是一个超时时间,而不是截止时间。
- 这个函数适用于需要在一段时间后取消操作的场景。
- context的使用场景
- 传递共享数据
- 传递取消信号,结束任务
- 超时控制
- context.Background()