打赏

go context理解

context包

总结起来就一句话:一个接口,四个实现,六个方法
(1.)一个接口

type Context interface {
	Deadline() (deadline time.Time, ok bool)
	Done() <-chan struct{}
	Err() error
	Value(key interface{}) interface{}
}

(2.)四个实现

a.) emptyCtx: 本质上是一个整型, *emptyCtx对Context接口的实现,只是简单的返回nil,false,Background和TODO这两个函数内部都会创建emptyCtx
b.) cancelCtx: 可以被取消。 取消后,它也会取消所有实现取消方法的子级。这是一种可取消的Context,done用于获取该Context的取消通知,children用于存储以当前节点为根节点的所有可取消的Context,以便在根节点取消时,可以把它们一并取消,err用于存储取消时指定的错误信息,而这个mu就是用来保护这几个字段的锁,以保障cancelCtx是线程安全的。而WithCancel函数,可以把一个Context包装为cancelCtx,并提供一个取消函数,调用它可以Cancel对应的Context
c.)timerCtx:它在cancelCtx的基础上,又封装了一个定时器和一个截止时间,这样既可以根据需要主动取消,也可以在到达deadline时,通过timer来触发取消动作。
要注意,这个timer也会由cancelCtx.mu来保护,确保取消操作也是线程安全的。通过WithDeadline和WithTimeout函数,都可以创建timerCtx,区别是WithDeadline函数需要指定一个时间点,而WithTimeout函数接收一个时间段。
d.) valueCtx: 它用来支持键值对打包,WithValue函数可以给Context附加一个键值对信息,这样就可以通过Context传递数据了

(3.)六个方法

相关链接

https://studygolang.com/articles/32660?fr=sidebar

posted @ 2021-02-09 11:33  苍山落暮  阅读(83)  评论(0编辑  收藏  举报