我有两个相互通信的服务,并且有单独的协议(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/