Golang protobufs 有名称冲突

标签 go protocol-buffers grpc

我有两个相互通信的服务,并且有单独的协议(protocol)文件。两者之间有一些共同的消息类型。当尝试测试运行时,我得到:

  2020/08/24 13:40:42 WARNING: proto: file "delivery.proto" has a name
  conflict over release.Patient     previously from:
 "gitlab.com/dhf0820/roirelease/protobufs/relPB"    currently from: 
 "gitlab.com/dhf0820/roi_delivery/protobufs/delPB"

如您所见,它们具有不同的包名称 relPB 和 delPB。患者在两种服务中都使用,我在两者之间编码/解码以发送正确的消息。我不确定这是否是正确的方法。

有没有更好的方法或者是怎么回事。我似乎有独特的名字。

最佳答案

看起来这些名称在生成的 Go 代码域 中是唯一的,但在 protobuf 域 中不是。

您真的可以将 protobuf 视为自己的语言,具有自己的包和命名空间语义(实际上类似于 C++)。在该域中,实际文件名无关紧要,重要的是文件中定义的包。

您的两个文件顶部可能都有 package release;。这意味着,在 protobuf 世界中,release.Patient 被定义了两次。 protoc 可能仍然能够意外生成有效的 Go 代码,但它仍然是格式错误的原型(prototype)定义。如果您尝试在其他语言(例如 C++)中使用相同的定义,或者如果您尝试使用依赖于原型(prototype)反射的库,您可能不会有同样的运气。如果您尝试将其中一条消息用作另一个文件中的字段,它也可能会中断; release.Patient 指的是哪个?

关于Golang protobufs 有名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63569200/

相关文章:

go - 对阻塞 channel 感到困惑

multithreading - 如何停止执行使用 HTTPClient 创建的请求

go - 获取网卡的 NetCfgInstanceId

python - 谷歌的 protorpc 坏了(元类错误)

在 gRPC 服务前使用 Envoy 代理时出现 SSL 错误 ERR_CERT_AUTHORITY_INVALID

c++ - 针对 Bigtable 的 gRPC C++ 客户端调用偶尔会挂起

go - For 循环以其主体结束

c++ - 从 Windows 上的文件中读取多个分隔的 protobuf 消息

c++ - protobuf 3 中的原始类型

hadoop - 如何使用配置单元读取自定义的 hdfs 文件