8.3.3 继承
前面介绍了Context的分层模式,以及继承在Context中应用的广泛性,那么Context是如何实现继承的呢?继承是靠context包提供的With系列函数实现的。
下面来看一下With系列函数,一共有四个:
func WithCancel(parent Context) (ctx Context,cancel CancelFunc) func WithDeadline(parent Context,deadline time.Time) (Context,CancelFunc) func WithTimeout(parent Context,timeout time.Duration) (Context,CancelFunc) func WithValue(parent Context,key,val interface{}) Context
通过这些函数可以创建一个树状的Context结构,而其每个节点都可以有多个层级。下面来对每个函数的作用进行说明。
▪WithCancel:parent Context根据参数创建一个新的children Context,同时还返回一个取消该children Context的函数CancelFunc。
▪WithDeadline:与WithCancel类似,但是会多传递一个截止时间参数,到了截止时间会自动取消该Context。
▪WithTimeout:与WithDeadline类似,超过参数的计数时间后会自动取消该Context。
▪WithValue:该函数的作用是生成一个绑定了一个键值对数据的Context,这个绑定的数据可以通过该Context的Value方法访问。该方法可以完成追踪功能,需要通过Context传递数据时可以使用该方法。
WithCancel函数的主要作用是在parent和children之间同步取消或结束信号,确定parent被取消时,其children也会收到信号而被取消。其实现的原理是所有的children都被保存在一个map中,如果是Context执行了Done方法会返回done channel,此时是正常结束所以返回以后就完结了;而如果是通过Err方法结束,则会遍历Context的所有children并关闭其channel。
WithDeadline是在WithCancel方法之上的扩展,如果截止时间到了以后开始cancel,其cancel的方法与WithCancel的方法一致,只是多了截止时间的设置。