比如下面的程序
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 。但不知道有没有什么开源程序,已经实现了这个?
1
ZSeptember 2022-12-28 17:14:35 +08:00
首先,这是 feature ,正常的业务代码不建议这样子写。
你要的其实是类似 Java 的 ThreadLocal ,一般传来传递一个 request 的上下文,tracing 之类的。 要实现也很简单,在入口或者中间件,给 context 放一个 map 就可以了,在 F1 函数将需要的值写入这个 map 。 |
2
wheeler 2022-12-28 17:23:51 +08:00 via iPhone
context 里面塞业务逻辑太骚了吧。直接返回值我觉得更好。
|
3
AlphaTr 2022-12-28 17:46:16 +08:00
Go context 包本身支持 context.WithValue 和 ctx.Value 这个设置和获取的方法;应该常见的 gin 、echo 的库在请求上下文也是支持自定义设置值的,可以参考
|
4
wqtacc 2022-12-28 19:59:38 +08:00
最后不这么用,context 传递的参数一般只用来做协程控制、超时控制,状态跟踪等,当然一层层的封装用相同的 key 传递 value ,下一步是能取到的
|
5
rrfeng 2022-12-28 20:06:52 +08:00
什么叫『有什么开源程序,已经实现了这个?』
不是两行代码的事吗?你不是已经说明白了要怎么写吗? 当然这个逻辑看着就很有问题。 不过看起来像是 http 业务常用的中间件的逻辑,F1 直接塞就行了,C 处没必要做啥。反正 context 塞啥都行。 |
6
tairan2006 2022-12-30 09:53:47 +08:00
context 一般是用来传递 trace 的,业务逻辑上反正我是没用过
|
7
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 |
8
chiuan 2023-02-01 15:07:59 +08:00
大家都很强啊!
|