前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >直击底层:原来 Context 还能这么用?(上)

直击底层:原来 Context 还能这么用?(上)

作者头像
小锟哥哥
发布2022-05-10 08:24:59
3330
发布2022-05-10 08:24:59
举报
文章被收录于专栏:GoLang全栈

什么是上下文?

我相信如果是一位刚学 Go 的同学,第一次接触 Context 时一定会蒙圈。

我先给你举一个例子:

如果你朋友张三,突然跑你面前给你说一句:”你傻得够可以呀“。

届时你会是什么反应呢?

他在骂我么?还是发生了什么我不知道的事?

这些疑问肯定会在脑袋里面出现。

但如果他在告诉你那句话之前告诉你:“我刚看了一部电影,里面有句台词觉得用得特别讽刺,如下:“

于是你得到的信息就变成了:

”我刚看了一部电影,里面有句台词觉得用得特别讽刺,如下:“

”你傻得够可以呀“

此时你是不是就知道他不是在骂你,也不是发生了啥你不知道的事。

而我们在写程序的时候,也经常会遇到这种情况。

比如:

你的一个博客系统,在修改文章时,你是不是需要确认下用户是否登录了。此时就需要一个能传递信息的媒介,我们就称他为上下文

Go 里面的 Context(上下文)

如果你会用 Gin 写程序,你或许会经常使用到 Context。

这是我从 Gin 官方文档里面截的图,Gin 为了方便处理自己做了一层封装。

其实 Go 官方也提供了一个 Context 包。

context 主要作用有以下:

  • key-value值
  • 取消信号
  • 超时信号

接下来我们挨个去演示讲解。

key-value值

上下文肯定会存在互相传值的情况,所以为我们提供了 context.WithValue 方法用于往上下文里面注入值。

直接上代码:

代码语言:javascript
复制
//模拟一个请求
func req1(ctx context.Context)  {
 fmt.Println(ctx.Value("begin"))
 fmt.Println("你傻得够可以呀")
}
func main() {
 // 创建一个上下文
 ctx := context.WithValue(context.Background(),"begin","我刚看了一部电影,里面有句台词觉得用得特别讽刺")
 // 传递过去
 req1(ctx)
}

这里把上面的场景给实现了一遍。

这段代码应该不需要做过多解释,main方法里面写值,req1方法里面取值。

为什么要用 WithValue 创建 Context ?

这里需要注意,我们创建出来的 ctx 是不能直接往里面写值的,像下图这样。

他只有这几个方法,没有 set 这类的方法。

那如果要往里面挂值怎么办?

只能套娃了,其实在 main 方法里面也是套娃的方式创建的 ctx,像这样。

篇幅有限,这篇就先写这一种用法,其他三个使用方法请期待下一篇。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是上下文?
  • Go 里面的 Context(上下文)
    • context 主要作用有以下:
    • key-value值
      • 为什么要用 WithValue 创建 Context ?
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档