给定以下 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。
- 1 回答
- 0 关注
- 262 浏览
添加回答
举报
0/150
提交
取消