首页 > 解决方案 > Golang gRPC 默认值

问题描述

给定以下 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 还是打算把它留空。

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

有没有办法实际找出客户端是否打算发送空值,或者它是否实际上将值设置为0?字符串等也是如此""

标签: gogrpcgrpc-go

解决方案


您无法区分缺失字段和在 proto3 中设置为默认值的字段。这是设计使然。在Issue 1606中引用 xfxyjwf :

  • 在 proto3 中删除字段存在的理由:

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

    • 移除字段存在使得 Proto3 更容易使用开放结构表示来实现,就像在 Android Java (go/nano-proto) 或 Go 等语言中一样。更容易的实施反过来又使其更容易被外部实施者社区访问。

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

推荐阅读