对于 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