当前位置: 首页 > news >正文

Protobuf 中的类型查找规则

a.proto

syntax = "proto2"; //protoc3生成代码兼容proto2语法
package pkgA;
message Example {
}

ba.proto

package pkgB.pkgA;
message Example {
}

b.proto

syntax = "proto3"; //protoc3生成代码兼容proto2语法
package pkgB;
import "test1/a.proto";
import "test1/ba.proto";
message Example {
}
message Test {Example simple = 9; // ①// 使用全名来引用 pkgA 中的 example.pkgA.Example field_in_pkgA = 1; // ②// 使用包名+类型名来引用pkgB.Example field_in_pkgB = 2; // ③pkgA.Example field_in_pkgA2 = 3; // ④pkgB.pkgA.Example field_in_pkgc = 4; // ⑤
}

类型引用规则说明部分

类型名中的 . 表示全限定名(全名),.pkg.msg 精确地表示 msg 属于 pkg。如果没有 .,则需要按照一定的规则查找类型。

  • 对于情况①:没有包的情况,以当前文件的包为准,最终结果:pkgB.Example
  • 对于情况②:以 . 开头表示全名,最终结果:.pkgA.Example
  • 对于情况③:包名是 pkgB,首先从当前包(当前文件与 pkgB 拼接),即 .pkgB.pkgB 中查找 Example,即 .pkgB.pkgB.Example。但没有找到,则会全局搜索,即 .pkgB.Example
  • 对于情况④:包名是 pkgA,首先从当前包即 .pkgB.pkgA 中查找 Example,最终结果:.pkgB.pkgA.Example。假如没找到,则会从全局搜索符号,即搜索 .pkgA.Example
  • 对于情况⑤:首先从当前包查找,由于没找到,从全局符号中搜索,最终结果:.pkgB.pkgA.Example

总结部分

  1. 对于全名,直接查找对应的 pkg。详细步骤是,搜索当前文件的所有 import,排除 pkg 不匹配的 import 文件,然后依次搜索哪个文件中有对应的类型。
  2. 对于没有类型 pkg 的情况,只从当前文件所在的包中搜索类型。
  3. 其他情况,依次执行
    • a. 在类型 pkg 前面拼接上当前文件的 pkg,在所有包名为 文件pkg.类型pkg 一致的 import 文件中,搜索该类型。
    • b. 在所有包名与当前文件一致的 import 文件中,搜索该类型。

相关文章:

  • MS358A 低功耗运算放大器 车规
  • 在 Windows 11 或 10 上将 Git 升级到最新版本的方法
  • Linux【4】------RK3568启动和引导顺序
  • JAVA理论第五章-JVM
  • ubuntu服务器件如何配置python环境并运行多个python脚本
  • Ubuntu20.04基础配置安装——系统安装(一)
  • 应急响应思路
  • 【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试
  • 深入理解 Vue.observable:轻量级响应式状态管理利器
  • Vue 项目实战:三种方式实现列表→详情页表单数据保留与恢复
  • UOS 20 Pro为国际版WPS设置中文菜单
  • iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform
  • Redis主从复制的原理一 之 概述
  • 数字通信复习
  • Kafka 消息模式实战:从简单队列到流处理(二)
  • C#:发送一封带有附件的邮件
  • SQL Server 日期时间类型全解析:从精确存储到灵活转换
  • 表单设计器拖拽对象时添加属性
  • C#合并CAN ASC文件:实现与优化
  • 在Ubuntu上使用 dd 工具制作U盘启动盘
  • 自己做淘宝返利网站/搜狗搜索网页版
  • 苏州网站建设科技有限公司/360优化大师app
  • 辽宁建设工程信息网场内业绩/宁波seo基础入门
  • 东山县城乡规划建设局网站/营销咨询公司排名
  • 烟台网站建设方案策划/企业建站模板
  • 使用QQ做网站客服/国外搜索引擎排名百鸣