介绍一下消息的不同类型和引用
您可以使用其他消息类型作为字段类型。例如,假设你想在每个SearchResponse
消息中包含Result
消息,您可以在同一个.proto
中定义一个Result
消息类型,然后在SearchResponse
中指定一个Result
类型的字段:
1 | message SearchResponse { |
在上述示例中,Result
消息类型与SearchResponse
在相同的文件中定义, 如果要使用的消息类型已经在另一个.proto
文件中定义了怎么解决呢?
你可以通过import
引入其他的.proto
文件:
1 | import "myproject/other_protos.proto"; |
注意
接上边的例子,假如a.proto
引入了b.proto
,但是b.proto
更换了位置,路径变成了test/b.proto
(随便举例),我们有两种解决办法:
a.proto
中的import
语句,直接import "test/b.proto"
b.proto
文件原来的位置,创建一个b.proto
文件,文件内容为import public "test/b.proto"
,就可以了
import
对proto2
和proto3
都适用
您可以在其他消息类型中定义和使用消息类型,如下,Result
消息定义在SearchResponse
消息中:
1 | message SearchResponse { |
如果想重复使用Result
,可以用Parent.Type
的方式使用:
1 | message AnotherResponse { |
修改时要注意的规则:
reserved
里Any
类型any类型时谷歌protobuf内置的一个类型,通用类型,使用的时候需要导入google/protbuf/any.proto
1 | import "google/protobuf/any.proto"; |
Oneof
类型Oneof结构中有多个字段,但是同一时刻只有一个字段生效
1 | message SampleMessage { |
oneof中可以是任意类型,除了repeated 字段
生成代码之后,也会对oneof字段生成getter,setter方法,但是出来的值需要你自己判断一下
如果你要定义一个map,protobuf提供了一个语法:
1 | map<key_type, value_type> map_field = N; |
例如
1 | map<string, Project> projects = 3; |
注意事项
repeated
.proto
文件生成时,map按key排序你可以添加一个可选标识package
到.proto
文件中。用来防止命名冲突
1 | package foo.bar; |
在使用这条消息的时候需要加上package
名字
1 | message Foo { |
原文:https://www.cnblogs.com/lijianming180/p/12037794.html