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

Go protobuf 反射的问题:如何根据 proto 路径动态地拿到解析后的值?

  •  
  •   horro · 35 天前 · 1188 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端入参:

    {
      proto_path:"path1/path2",
      message_name: "message1",
      field_path:"field1.field2"
    }
    

    后端

    proto/
    ├── path1/
    │   ├── path2/
    │   │   ├── proto1/
    │   │   │   └── proto1.pb.go   // proto1 和 proto2 在经过 protoc-gen-go 转译之前同属于	
    │   │   ├── proto2/            // 名称为 path2 的 proto package, message1 位于 proto1 中
    │   │   │   └── proto2.pb.go
    │   ├── path4/
    │   │   └── message3.proto
    │   └── utils.proto
    ├── path5/
    │   └── message4.proto
    └── path6/
        └── message5.proto
    

    需要根据传入的参数来拿到对应 proto 下 message2 的值,由于 proto 比较大,无法维护路径与 message 的 go 结构体定义的映射,需要通过反射去动态取值。 对 go protobuf 反射不太熟,这个搞不太定,有无大神帮忙看看👀

    7 条回复    2025-01-19 17:18:52 +08:00
    horro
        2
    horro  
    OP
       35 天前 via iPhone
    @qzzz 之前问 ai 有提过这个 registry ,但是给的代码都没用到我的 proto 定义,我就略过去了🥲
    SingeeKing
        3
    SingeeKing  
       35 天前
    用 path 是不是有点奇怪,正常做法应该是用 package 的,然后在 registry 查就行

    ---

    如果是一些特殊的服务无法保证 package 唯一,那么可能唯一的办法就是写个脚本来生成了
    guanzhangzhang
        4
    guanzhangzhang  
       35 天前   ❤️ 1
    github.com/jhump/protoreflect 之前写的一个逆向生成 pb 文件,用了这个库实现的
    horro
        5
    horro  
    OP
       34 天前
    @SingeeKing #3 对,前端传入的 path 其实就是与 pacakge 对应的
    horro
        6
    horro  
    OP
       34 天前
    @qzzz #1 太赞了,已经用 registry 完成了上述的需求。唯一一个小问题,proto.pb.go 必须引入到 go 代码中才会触发 build 中的 mapping 注册逻辑,我目前是在 CI/CD 流程里加了个自动化去遍历 proto 目录生成了一个专门用来引入 proto.pb.go 文件的.go 文件。虽然这个方案能用,但是看着不太好的样子,有没有办法手动触发对整个 proto path 的注册呢?
    qzzz
        7
    qzzz  
       33 天前
    @horro #6 不行吧, 不 import 都不会编译也就没 init, 注册这些都是在 init 中的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2852 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:45 · PVG 15:45 · LAX 23:45 · JFK 02:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.