下面是我的protobuf定义:
enum Foo {
BAR = 0;
BAZ = 1;
}
message UpdateRequest {
string id = 1;
Foo foo = 2;
.
.
.
}
我需要UpdateRequest
的foo
字段可以为空,但是,如果我不设置这个字段的值,那么根据protobuf语义,它总是选择BAR
作为默认值。
环顾四周,我找到了几个解决办法。
1.在枚举中添加一个额外的UNKNOWN
值,并将其Map到0
,以便将此值用作默认值,而不是BAR
,我可以将此值视为空值。
enum Foo {
UNKNOWN = 0;
BAR = 1;
BAZ = 2;
}
1.使用oneof
结构。
然而,不知何故,我觉得上述两种方法都是一种变通办法,我无法找到解释处理这种情况的最佳做法的官方文档。
处理此使用情形的最佳做法是什么?
2条答案
按热度按时间wpcxdonn1#
您应该能够使用
hasFoo()
检查字段,而getFoo()
将返回BAR
,hasFoo()
应返回false
。6vl6ewon2#
仅当不希望使用
UNKNOWN
枚举值时才继续阅读。不知道这是否是最佳实践,但每当我发送对象本身的值不能为空时,我使用
enum
值,而在请求(如UpdateRequest
)中,当它可以为空时,我使用string
类型代替,并手动处理转换。