为了账号安全,请及时绑定邮箱和手机立即绑定

Golang gRPC 默认值

Golang gRPC 默认值

Go
慕神8447489 2022-05-18 16:42:54
给定以下 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?字符串等也是如此""。
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

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

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

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

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

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


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信