Golang gRPC default values



给定以下protobuf定义:

message MyMessage {
string Foo = 1;
int From = 2;
int To = 3;
}

然后我有一个案例,我只想从客户端发送Foo字符串,没有问题。问题出现在服务器上,我想知道From和to是否有值(UNIX时间戳(。如果客户端没有明确设置该值,那么Go会将该值设置为0,这是一个完全有效的Unix时间戳。在这一点上,我不知道客户是打算给我1970-01-01 00:00:00,还是打算让它空着。

我可以添加两个bool,说明From和To是否由客户设置,但我觉得应该有一个比这更优雅的解决方案。

有没有一种方法可以真正查明客户端是否打算发送null值,或者它是否真的将值设置为0?字符串的""也是如此,依此类推。

您无法区分不存在的字段和proto3中设置为默认值的字段。这是经过设计的。引用xfxyjwf在第1606期:

  • 在proto3:中消除现场存在的基本原理

    • proto2中的字段存在引起了混淆,并使语义复杂化,例如必须区分缺席字段和设置为默认值的字段;用户通常在访问不必要的字段之前检查是否存在。我们相信在大多数情况下,不需要字段存在信息。

    • 删除字段存在使Proto3更易于使用开放结构实现表示,如在Android Java(go/nano-proto(或go等语言中。越容易实现反过来又使外部实现者社区能够更好地访问它。

  • 如果明确需要这样的存在信息,则有几种解决方法,例如包装器、显式has_field布尔值。如果向后兼容proto2可选,也可以使用Oneof字段

最新更新