优质
小牛编辑
126浏览
2023-12-01

注:内容翻译自官网文档 Language Guide (proto3) 中的 Packages 一节

可以在.proto文件中增加一个可选的包标记来防止protocol消息类型之间的名字冲突.

package foo.bar;
message Open { ... }

在定义消息类型的字段时可以这样使用包标志:

message Foo {
  ...
  foo.bar.Open open = 1;
  ...
}

包标志对生成代码的影响依赖所选的语言:

  • 在c++中, 生成类包裹在c++ namespace中. 例如, Open将在namespace foo::bar中.
  • 在java中, 包被作为java package使用, 除非你在.proto文件中显式提供java_package选项.
  • 在Python中, 这个包指令将被忽略, 因为Python模块是根据他们在文件系统中的位置被组织的.
  • 在Go中, 包被作为Go package使用, 除非你在.proto文件中显式提供go_package选项.
  • 在Ruby中, 生成的代码被包裹在内嵌的Ruby namespaces, 转换为要求的Ruby capitalization风格(第一个字符大写;如果第一个字符不是字母则加一个PB_前缀). 例如, Open将在namespace Foo::Bar中.
  • 在JavaNano中, 包被作为java package使用, 除非你在.proto文件中显式提供java_package选项.

包和命名解析

在protocol buffer语言中, 类型命名解析类似 C++: 首先搜索最内层的范围, 然后最内层的外一层, 以此类推, 每个包都被认为是它父包的"内层". 在最前面的'.'(例如, .foo.bar.Baz)意味着替换为从最外层范围开始.

protocol buffer编译器通过解析导入的.proto文件来解析所有的类型命名. 每个语言的代码生成器知道在这个语言中如何引用每个类型, 即使它有不同的范围规则.