从 protobuf 3.15 版开始,proto3 支持使用optional
关键字(就像在 proto2 中一样)来提供标量字段存在信息。
syntax = "proto3";
message Foo {
int32 bar = 1;
optional int32 baz = 2;
}
为上面的字段生成一个has_baz()
/hasBaz()
方法optional
,就像在 proto2 中一样。
正如CyberSnoopy 的回答所建议的那样,在幕后,protoc有效地将optional
字段视为使用oneof
包装器声明的:
message Foo {
int32 bar = 1;
oneof optional_baz {
int32 baz = 2;
}
}
如果您已经使用过这种方法,您现在可以简化您的消息声明(从 切换oneof
到optional
)和代码,因为有线格式是相同的。
有关字段存在和optional
proto3 的详细信息可以在应用说明:字段存在文档中找到。
历史记录:对 proto3 的实验性支持optional
于 2020 年 4 月 23 日在此评论中首次宣布。使用它需要--experimental_allow_proto3_optional
在 3.12-3.14 版本中传递 protoc 标志。