简单认识context的作用:
用于在 API 调用链中携带请求范围的截止时间、取消信号、以及请求相关的元数据的机制。如果你的goroutine, 函数中,如果希望被控制, 超时、传值,但是我不希望影响我原来的接口信息的时候,函数参数中第一个参数就尽量的要加上一个ctx。
实际上context包主要实现了三个功能:
创建上下文:
context.Background(): 打算启动已知上下文的地方,通常我们都使用这个
context.TODO(): 不确定要使用哪个上下文时,可以将其用作占位符
空的上下文无用处,因为其中的Done(),Err()等方法返回的都是nil;
携带键值对:
context.WithValue():可以让 Context 实现携带键值对的功能

注意:返回的 Context 与其是派生关系。
在使用的场景中,通常比如一个订单id从下单到付款,只需要在context中定义一次后续就可以直接取到。
传递取消信号:
context.WithCancel():主动取消
context.WithDeadline():设置上下文需要完成的截止时间,在到达截止时间之后回自动结束(在对应的时间取消)
context.WithTimeout():设置上下文的超时时间,在到达超时之后自动结束(超时取消)
实际上在阅读源码的过程中可以看到,withDeadLine和withTimeOut是很相似的
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
WithTimeout() 是在当前时间上加了一个超时时间,然后调用 WithDeadline() 函数实现的超时取消功能。这样也有助于对WithDeadline的理解
传递取消信号,通过调用Done()返回的cannel(),来完成部分的逻辑处理.
WithCancel()方法是结束上下文最直接的方式,通过传入参数ctx,就可以直接结束上下文.
2299

被折叠的 条评论
为什么被折叠?



