码迷,mamicode.com
首页 > 其他好文 > 详细

go context理解

时间:2021-02-10 12:51:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:bool   通过   ref   lct   取消   传递   round   deb   target   

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

go context理解

标签:bool   通过   ref   lct   取消   传递   round   deb   target   

原文地址:https://www.cnblogs.com/tomtellyou/p/14392361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!