go语言中关于上下文相关的知识
文章目录
1. 上下文的组成
1.1 树根
上下文在某个环境中定义了两棵树,分别是:
树A
ctxA := context.Background()
树B
ctxB := context.TODO()
可以把A
和B
作为树的根节点,从context
包里能看到这两个方法的底层实现其实一模一样,可能
是为了某个环境需要有多个上下文同时使用而设立的
1.2 树叶
1.2.1 context.WithCancel
树叶包括四个方法:
context.WithCancel
带取消方法的派生上下文
ctxC,cancel := context.WithCancel(ctxA)
defer cancel()
1.2.2 context.WithDeadline和context.WithTimeout
context.WithDeadline
和 context.WithTimeout
都是超时自动取消,其中 timeout的底层
实现还是deadline,只不过换了个形式罢了
ctxD,cancel := context.WithDeadline(ctx,time.Now().Add(1 * time.Second))
ctxE,cancel := context.WithTimeout(ctx,1 * time.Second)
1.2.1 context.WithValue
context.WithValue
给上下文添加键值对
添加:
const GOLABLE_KEY = "context"
ctxF = context.WithValue(ctxA, GOLABLE_KEY, "hello world")
取值:
value := ctxF.Value(GOLABLE_KEY).(string)
log.Println(value)
2. 上下文传递值
我们有时候会遇到某个上下文在传递的时候,需要进行数据的检查,这时候可以用上
context.WithValue
----存储和检索附加于请求的数据包
如下例:
package main
import (
"context"
"fmt"
)
func main() {