原文在这里

什么是Protocol Buffer命名空间冲突?

所有链接到Go二进制文件的Protocol Buffer声明都被插入到一个全局注册表中。

每个Protocol Buffer声明(例如,枚举、枚举值或消息)都有一个绝对名称,该名称是包名称与.proto源文件中声明的相对名称的连接(例如,my.proto.package.MyMessage.NestedMessage)。Protocol Buffer语言假设所有声明都是普遍唯一的。

如果链接到Go二进制文件的两个Protocol Buffer声明具有相同的名称,那么这将导致命名空间冲突,注册表无法通过名称正确解析该声明。根据使用的Go protobuf版本不同,这可能会在初始化时引发panic,或者静默地忽略冲突,并在运行时可能导致潜在的错误。

如何解决Protocol Buffer命名空间冲突?

解决命名空间冲突的最佳方法取决于冲突发生的原因。

常见的命名空间冲突原因有:

  1. 存在vendored(供应商)的.proto文件。当一个单独的.proto文件被生成为两个或更多的Go包,并且链接到同一个Go二进制文件时,会在生成的Go包中的每个Protocol Buffer声明上发生冲突。这通常发生在一个.proto文件被vendored,并且从它生成了一个Go包,或者生成的Go包本身被vendored。用户应避免vendored,而是依赖于集中化的Go包来使用该.proto文件。

  2. 如果一个.proto文件由外部组织拥有,并且缺少go_package选项,则应与该.proto文件的所有者协调,以指定一个集中化的Go包,所有用户都可以依赖。

  3. 缺失或使用过于通用的proto包名称。如果一个.proto文件没有指定包名称或使用过于通用的包名称(例如,“my_service”),那么该文件内部的声明很可能与宇宙中的其他声明发生冲突。我们建议每个.proto文件都有一个包名称,该名称是经过深思熟虑选择的,具有普遍唯一性(例如,以公司名称为前缀)。

警告: 在.proto文件上后期更改包名称可能会导致使用扩展字段或存储在google.protobuf.Any中的消息停止正常工作。

从google.golang.org/protobuf模块的v1.26.0版本开始,当启动一个Go程序时,如果链接到其中多个冲突的Protocol Buffer名称,将报告一个严重错误。虽然最好是修复冲突的源头,但可以通过以下两种方式立即解决致命错误:

  • 在编译时设置。可以在编译时通过链接器初始化的变量来指定处理冲突的默认行为:go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
  • 在程序执行时设置。可以通过环境变量来设置处理冲突的行为,当执行特定的Go二进制文件时:GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


Protocol Buffer命名空间冲突的更多相关文章

  1. [原创翻译]Protocol Buffer Basics: C#

    Protocol Buffer 基础知识:c#    原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial   ...

  2. Ggoogle Protocol Buffer的使用 (基于C++语言)

    首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...

  3. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  4. protocol buffer介绍(protobuf)

    一.理论概述0.参考资料入门资料:https://developers.google.com/protocol-buffers/docs/javatutorial更详细的资料:For more det ...

  5. [翻译]Protocol Buffer 基础: C++

    目录 Protocol Buffer Basics: C++ 为什么使用 Protocol Buffers 在哪可以找到示例代码 定义你的协议格式 编译你的 Protocol Buffers Prot ...

  6. Google Protocol Buffer的安装与.proto文件的定义(转)

    转自(https://www.cnblogs.com/yinheyi/p/6080244.html) 什么是protocol Buffer呢? Google Protocol Buffer( 简称 P ...

  7. Protocol Buffer Basics: C#

    Protocol Buffer 基础知识:c#    原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial   ...

  8. Protocol Buffer学习教程之语法手册(二)

    1.说明 此向导介绍如何使用protocol buffer language创建一个自己的protocolbuffer文件,包括语法与如何通过“.proto”文件生成数据访问的类,此处只介绍proto ...

  9. 详解Python Google Protocol Buffer

    为什么要使用PB? PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式.因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据 ...

  10. 学习Google Protocol buffer之语法

    上一篇结尾的时候问了几个问题,其实主要就是这个protoBuffer协议的语法,弄清楚语法后边才好开展工作嘛,不然大眼而对小眼儿,互相不认识,就没法玩耍了.其实就是学习怎么用google提供的这套 p ...

随机推荐

  1. MySQL 错误记录:Data too long for column 'xxx' at row 1

    Content 字段是 text 类型(Text是6万多)改成了 longtext 就OK了 ALTER TABLE `Article` CHANGE `Content` `Content` LONG ...

  2. python 使用 Google Gemini API

    python 使用 Google Gemini API 注册APIKEY : Google AI Studio [免费] import base64 import requests import js ...

  3. Nginx--安装&&配置文件

    官网:http://nginx.org/en/download.html nginx版本:1.18   一 安装 1 下载预编译环境(预编译报错需要安装什么库 直接在库名后面接 -devel 使用yu ...

  4. HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java

    Viterbi 维特比算法解决的是篱笆型的图的最短路径问题,图的节点按列组织,每列的节点数量可以不一样,每一列的节点只能和相邻列的节点相连,不能跨列相连,节点之间有着不同的距离,距离的值就不在 题目背 ...

  5. Linux Page Cache调优在Kafka中的应用

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/MaeXn-kmgLUah78brglFkg作者:Yang Yijun 本文主要描述Linux ...

  6. java获取部门树的方法实例

    开发中如何获取一个树结构是非常常见的需求,本示例演示一下该功能如何实现. 1.数据准备(mysql) CREATE TABLE `dept` ( `dept_id` int NOT NULL AUTO ...

  7. python之排序的几种方法

    一.通过sort()可以快速实现数组的排序: 1 a=[2,3,1] 2 a.sort() 3 print(a) 打印返回结果: 二.如果不知道有sort()函数或者一些特殊场景需要排序时,如果解决呢 ...

  8. java进阶(1)--final、常量

    final是java的关键字,主要表示最终的 一.final修饰的类无法被继承

  9. Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作

    本文为博主原创,转载请注明出处: 1. 使用 ThreadPoolTaskExecutor  封装自定义配置的线程池Bean ThreadPoolTaskExecutor 是Spring 中封装的一个 ...

  10. 问题--去除CSDN水印

    1.问题如上 有时候需要使用其中的图片,但是水印很让人烦恼 确实可以用PS中的修复画笔工具,修复工具等进行处理 但是当水印覆盖到字体时,就会破坏到原有字体 2.解决方式 从CSDN添加水印的方式入手 ...