Go微服务实战
上QQ阅读APP看书,第一时间看更新

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的方法一致,只是多了截止时间的设置。