从 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)和代码,因为有线格式是相同的。
有关字段存在和optionalproto3 的详细信息可以在应用说明:字段存在文档中找到。
历史记录:对 proto3 的实验性支持optional于 2020 年 4 月 23 日在此评论中首次宣布。使用它需要--experimental_allow_proto3_optional在 3.12-3.14 版本中传递 protoc 标志。