protocol-buffers namespace conflict

在运行grpc服务,加载*.pb.go时可能会报冲突错误,如文件名命名冲突:
图片.png
其实针对文件名冲突的错误处理开发者有移除过"文件冲突检测":
https://github.com/protocolbuffers/protobuf-go/commit/febffdd88e85cb4402205142aaa1a4cc64d0d375
后来发现有问题又加上了"文件冲突检测":
https://github.com/protocolbuffers/protobuf-go/commit/21e33cc91079beb975323466e237f2486ea29c10

protocol-buffers命名空间冲突的几种情况:

注意package和go_package没有必然联系,下面说的package是proto里面的package不是go的引入包
  • file冲突, 注册的时候会检查文件(即source)冲突
    图片.png
  • <pkg name>.<entity name>不能冲突,<pkg name>.<entity name>也不能和<pkg name>冲突。如package叫"A.B", 如果此时另外一个package叫"A",里面有个"B"的message,那么这个message的fullName叫做“A.B”就会和前面的package "A.B"冲突。package的名字可以相同,比如可以有两个package都叫"A"
    图片.png

protocol buffer冲突检查相关的代码:

https://github.com/protocolbuffers/protobuf-go/blob/master/reflect/protoregistry/registry.go
filesByPath主要检查文件冲突, descsByName来检查各类型之间fullName有没有相互冲突
图片.png
如果实在需要更改冲突处理策略,可以运行时指定命令或者配置环境变量:
图片.png

参考:

3 声望
0 粉丝
0 条评论
推荐阅读
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin21阅读 2.8k评论 3

封面图
SegmentFault 思否正式开源问答社区软件 Answer
作为国内领先的新一代技术问答社区,SegmentFault 思否团队在社区建设上有着多年积累。Answer 不仅拥有搭建问答平台(Q&A Platform)的基础功能,还在产品设计上融入了开发团队对社区发展的思考,并将其经验产品...

SegmentFault思否29阅读 4.2k评论 14

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀21阅读 54.6k评论 1

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100214阅读 11k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100213阅读 11.1k评论 4

【已结束】SegmentFault 思否技术征文丨浅谈 Go 语言框架
亲爱的开发者们:我们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢迎大家来参与分享~征文时间11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前发布中奖名单参与条件新老思否作者均可参加征文...

SegmentFault思否11阅读 4.6k评论 11

封面图
【Go微服务】开发gRPC总共分三步
之前我也有写过RPC相关的文章:《 Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?》,详细介绍了RPC是什么,使用边界在哪里?并且用Go和php举例,实现了跨语言调用。不了解RPC的同学建议先读这篇文...

王中阳Go8阅读 3.6k评论 6

封面图
3 声望
0 粉丝
宣传栏