Go 有没有什么开源库,给 context 预留 Value 的坑?

2022-12-28 16:17:23 +08:00
 1800x

比如下面的程序

func F1(ctx context.Context) {
	// A
}

func F2(ctx context.Context) {
	// C

	F1(ctx)
    
    // B
}

A 处,可以取得一些变量。

现实是 B 处需要 A 获得的变量。 一个办法,修改函数 F1 ,让 F1 返回 B 需要的数据。 或者,C 处给 ctx 塞一个 value 坑,F1 把数据存到 value 坑上,B 再取到 value 。但不知道有没有什么开源程序,已经实现了这个?

2643 次点击
所在节点    Go 编程语言
8 条回复
ZSeptember
2022-12-28 17:14:35 +08:00
首先,这是 feature ,正常的业务代码不建议这样子写。
你要的其实是类似 Java 的 ThreadLocal ,一般传来传递一个 request 的上下文,tracing 之类的。
要实现也很简单,在入口或者中间件,给 context 放一个 map 就可以了,在 F1 函数将需要的值写入这个 map 。
wheeler
2022-12-28 17:23:51 +08:00
context 里面塞业务逻辑太骚了吧。直接返回值我觉得更好。
AlphaTr
2022-12-28 17:46:16 +08:00
Go context 包本身支持 context.WithValue 和 ctx.Value 这个设置和获取的方法;应该常见的 gin 、echo 的库在请求上下文也是支持自定义设置值的,可以参考
wqtacc
2022-12-28 19:59:38 +08:00
最后不这么用,context 传递的参数一般只用来做协程控制、超时控制,状态跟踪等,当然一层层的封装用相同的 key 传递 value ,下一步是能取到的
rrfeng
2022-12-28 20:06:52 +08:00
什么叫『有什么开源程序,已经实现了这个?』
不是两行代码的事吗?你不是已经说明白了要怎么写吗?

当然这个逻辑看着就很有问题。

不过看起来像是 http 业务常用的中间件的逻辑,F1 直接塞就行了,C 处没必要做啥。反正 context 塞啥都行。
tairan2006
2022-12-30 09:53:47 +08:00
context 一般是用来传递 trace 的,业务逻辑上反正我是没用过
mauve
2022-12-31 00:18:25 +08:00
官方建议不要放一些 optional parameters
https://github.com/golang/go/blob/master/src/context/context.go#L573-L574

但如 6 楼所说,一些 trace 信息是可以塞进去的,我用来存放一些 token header user id

也不用怎么写,官方给了一个非常简单的写法,其实可以自己封装一下
https://github.com/golang/go/blob/master/src/context/context.go#L144-L158
chiuan
2023-02-01 15:07:59 +08:00
大家都很强啊!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/905183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX