标签:bool 通过 ref lct 取消 传递 round deb target
总结起来就一句话:一个接口,四个实现,六个方法
(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
标签:bool 通过 ref lct 取消 传递 round deb target
原文地址:https://www.cnblogs.com/tomtellyou/p/14392361.html