golang-Context内部关系梳理

5次阅读

共计 718 个字符,预计需要花费 2 分钟才能阅读完成。

对于 golang 的内置包 Context,做了个思维导图,方便学习

结构体 / 接口关系

从图中可以很容易看出:
1.Context 主要包含了三个接口
Context 接口
canceler 接口
stringer 接口
两个内部接口,一个外部接口

2. 主要实现了三种结构体,其实就对应 context 的三种功能
1)同步取消功能
对应结构体 cancelCtx,其重写了 Context 接口的三个方法:

Value
Done
Err

并实现了接口 canceler,对应方法 cancel 和 Done
也实现了接口 stringer,对应方法 String
2)超时控制功能
对应结构体 timerCtx,其匿名内嵌了 cancelCtx 结构体,相当于继承了 cancelCtx 的所有方法
重写了 Deadline 方法
3)K- V 功能
对应结构体 valueCtx,其匿名内嵌了 Context 接口
重写了 Value 方法

对外函数

1.WithCancel
内部创建 cancelCtx 对象,返回时,强转为 Context 接口对象,并返回 cancelCtx 重写的 cancel 方法

2.WithTimeout 和 WithDeadline
两者是相同的功能,WithTimeout 就是直接调用 WithDeadline 实现的
其内部也是创建 timerCtx 对象(这个对象包含了新建的一个 cancelCtx 对象)
由于 timerCtx 重写了 cancel 方法,所以返回的是 timerCtx 的 cancel

3.WithValue
创建 valueCtx 对象,返回时,强转为 Context 接口对象
并不返回 cancel 方法
不过 valueCtx 重写了 Value 方法,所以返回的 Context 接口如果调用 Value 方法,就是调用的 valueCtx 实现的 Value

正文完
 0