提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
前面有一些例子是使用context 来处理goroutine 的退出的。
现在 我们来看一下这个包吧!
一、context
请看官网文档 context package - context - pkg.go.dev
函数签名
// 创建一个带有新的 Done channel 的 context,并且返回一个取消的方法
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
// 创建一个具有截止时间的 context
// 截止时间是 d 和 parent(如果有截止时间的话) 的截止时间中更早的那一个
// 当 parent 执行完毕,或 cancel 被调用 或者 截止时间到了的时候,这个 context done 掉
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
// 其实就是调用的 WithDeadline
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
type CancelFunc
context.Context 接口
type Context interface {
//Deadline返回代表此上下文完成工作的时间
//应该取消。截止日期返回ok==无截止日期时为false
//设定。连续调用Deadline返回相同的结果。
Deadline() (deadline time.Time, ok bool)
//Done返回一个通道,当代表该通道完成工作时,该通道关闭
//应该取消上下文。如果此上下文可以,则Done可能返回nil
//永远不要取消。连续调用Done返回相同的值
Done() <-chan struct{}
Err() error
// 用于返回 context 中保存的值
Value(key interface{}) interface{}
}
context.Backgroud 和 TODO
一般用于创建 root context,这个 context 永远也不会被取消,或者是 done
var (
background = new(emptyCtx)
todo = new(emptyCtx)
)
// Background returns a non-nil, empty Context. It is never cancele