文章目录
What is context
Context 中文为 上下文
,可以用来简化单个请求多个 goroutine 之间关于数据共享,取消信号,截止时间等操作。
Context 结构
Context 在 golang 工具包中,是一个 interface,其结构如下:
type Context interface {
// 获取设置的截止时间的意思,第一个返回式是截止时间,到了这个时间点,Context会自动发起取消请求;第二个返回值ok==false时表示没有设置截止时间,如果需要取消的话,需要调用取消函数进行取消。
Deadline() (deadline time.Time, ok bool)
// 返回一个只读的chan,类型为struct{},我们在goroutine中,如果该方法返回的chan可以读取,则意味着parent context已经发起了取消请求,我们通过Done方法收到这个信号后,就应该做清理操作,然后退出goroutine,释放资源。
Done() <-chan struct{
}
// 返回取消的错误原因,因为什么Context被取消
Err() error
// 获取该Context上绑定的值,是一个键值对,所以要通过一个Key才可以获取对应的值,这个值一般是线程安全的。
Value(key interface{
}) interface{
}
}
Context 接口并不需要我们实现,golang 内置了 2 个实现,可以把这 2 个内置的 context 作为顶层的 parent context,基于 parent context 继承派生 children context
var (
background = new(emptyCtx)
todo = new(emptyCtx)
)
func Background() Context {
return background
}
func TODO() Context {
return todo
}
一个是
Background
,主要用于main函数、初始化以及测试代码中,作为Context这个树结构的最顶层的Context,也就是根Context。一个是
TODO
,它目前还不知道具体的使用场景,如果我们不知道该使用什么Context的时候,可以使用这个。他们两个本质上都是
emptyCtx
结构体类型,是一个不可取消,没有设置截止时间