Language Guide (proto3) | proto3 语言指南(十一)包
Packages - 包
可以向.proto
文件中添加可选的package
明符,以防止协议消息类型之间的名称冲突。
package foo.bar;
message Open { ... }
然后你可以在定义你的消息类型的字段时使用包说明符:
message Foo {
...
foo.bar.Open open = 1;
...
}
包说明符对生成代码的影响取决于您选择的语言:
- 在C++中,生成的类被封装在C++命名空间内。例如,
Open
将位于名称空间foo::bar
中。 - 在Java中,该包用作Java包,除非在
.proto
文件中显式提供option java_package
。 - 在Python中,
package
指令被忽略,因为Python模块是根据它们在文件系统中的位置来组织的。 - 在Go中,包用作Go包名称,除非在
.proto
文件中显式提供option go_package
。 - 在Ruby中,生成的类被包装在嵌套的Ruby名称空间中,并转换为所需的Ruby大写样式(第一个字母大写;如果第一个字符不是字母,则在前面加上
PB_
)。例如,Open
将位于名称空间Foo::Bar
中。 - 在C#中,包在转换为帕斯卡命名法后用作命名空间,除非在
.proto
文件中显式提供选项option csharp_namespace
。例如,Open
将位于Foo.Bar
命名空间中。
包和名称的解析
协议缓冲区语言中的类型名称解析的工作方式与C++类似:首先搜索最内层的作用域,然后搜索下一个最内层的作用域,以此类推,每个包都被认为是其父包的“内层”。以“.”开头(例如.foo.bar. baz)意味着从最外层的作用域开始。
协议缓冲区编译器通过解析导入的.proto文件来解析所有类型名。每种语言的代码生成器都知道如何引用该语言中的每种类型,即使它有不同的作用域规则。