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

239 天前
 horro

前端入参:

{
  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 反射不太熟,这个搞不太定,有无大神帮忙看看👀

1499 次点击
所在节点    Go 编程语言
7 条回复
qzzz
239 天前
horro
239 天前
@qzzz 之前问 ai 有提过这个 registry ,但是给的代码都没用到我的 proto 定义,我就略过去了🥲
SingeeKing
239 天前
用 path 是不是有点奇怪,正常做法应该是用 package 的,然后在 registry 查就行

---

如果是一些特殊的服务无法保证 package 唯一,那么可能唯一的办法就是写个脚本来生成了
guanzhangzhang
238 天前
github.com/jhump/protoreflect 之前写的一个逆向生成 pb 文件,用了这个库实现的
horro
238 天前
@SingeeKing #3 对,前端传入的 path 其实就是与 pacakge 对应的
horro
238 天前
@qzzz #1 太赞了,已经用 registry 完成了上述的需求。唯一一个小问题,proto.pb.go 必须引入到 go 代码中才会触发 build 中的 mapping 注册逻辑,我目前是在 CI/CD 流程里加了个自动化去遍历 proto 目录生成了一个专门用来引入 proto.pb.go 文件的.go 文件。虽然这个方案能用,但是看着不太好的样子,有没有办法手动触发对整个 proto path 的注册呢?
qzzz
237 天前
@horro #6 不行吧, 不 import 都不会编译也就没 init, 注册这些都是在 init 中的.

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

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

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

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

© 2021 V2EX