【问题标题】:Golang gRPC default valuesGolang gRPC 默认值
【发布时间】:2020-06-16 18:41:00
【问题描述】:

给定以下 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?对于字符串等,"" 也是如此。

【问题讨论】:

    标签: go grpc grpc-go


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2020-09-01
      • 2017-01-02
      • 2022-01-11
      • 2022-11-24
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多