我相信如果是一位刚学 Go 的同学,第一次接触 Context 时一定会蒙圈。
我先给你举一个例子:
如果你朋友张三,突然跑你面前给你说一句:”你傻得够可以呀“。
届时你会是什么反应呢?
他在骂我么?还是发生了什么我不知道的事?
这些疑问肯定会在脑袋里面出现。
但如果他在告诉你那句话之前告诉你:“我刚看了一部电影,里面有句台词觉得用得特别讽刺,如下:“
于是你得到的信息就变成了:
”我刚看了一部电影,里面有句台词觉得用得特别讽刺,如下:“
”你傻得够可以呀“
此时你是不是就知道他不是在骂你,也不是发生了啥你不知道的事。
而我们在写程序的时候,也经常会遇到这种情况。
比如:
你的一个博客系统,在修改文章时,你是不是需要确认下用户是否登录了。此时就需要一个能传递信息的媒介,我们就称他为上下文。
如果你会用 Gin 写程序,你或许会经常使用到 Context。
这是我从 Gin 官方文档里面截的图,Gin 为了方便处理自己做了一层封装。
其实 Go 官方也提供了一个 Context 包。
接下来我们挨个去演示讲解。
上下文肯定会存在互相传值的情况,所以为我们提供了 context.WithValue 方法用于往上下文里面注入值。
直接上代码:
//模拟一个请求
func req1(ctx context.Context) {
fmt.Println(ctx.Value("begin"))
fmt.Println("你傻得够可以呀")
}
func main() {
// 创建一个上下文
ctx := context.WithValue(context.Background(),"begin","我刚看了一部电影,里面有句台词觉得用得特别讽刺")
// 传递过去
req1(ctx)
}
这里把上面的场景给实现了一遍。
这段代码应该不需要做过多解释,main方法里面写值,req1方法里面取值。
这里需要注意,我们创建出来的 ctx 是不能直接往里面写值的,像下图这样。
他只有这几个方法,没有 set 这类的方法。
那如果要往里面挂值怎么办?
就只能套娃了,其实在 main 方法里面也是套娃的方式创建的 ctx,像这样。
篇幅有限,这篇就先写这一种用法,其他三个使用方法请期待下一篇。