V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
1800x
V2EX  ›  Go 编程语言

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

  •  
  •   1800x · 2022-12-28 16:17:23 +08:00 · 2368 次点击
    这是一个创建于 456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面的程序

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

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

    不过看起来像是 http 业务常用的中间件的逻辑,F1 直接塞就行了,C 处没必要做啥。反正 context 塞啥都行。
    tairan2006
        6
    tairan2006  
       2022-12-30 09:53:47 +08:00
    context 一般是用来传递 trace 的,业务逻辑上反正我是没用过
    mauve
        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
    chiuan
        8
    chiuan  
       2023-02-01 15:07:59 +08:00
    大家都很强啊!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1430 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:48 · PVG 07:48 · LAX 16:48 · JFK 19:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.