go - 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
?字符串等也是如此""
。
解决方案
您无法区分缺失字段和在 proto3 中设置为默认值的字段。这是设计使然。在Issue 1606中引用 xfxyjwf :
在 proto3 中删除字段存在的理由:
proto2 中的字段存在引起了混淆,并使语义复杂化,例如,必须区分缺失字段与设置为默认值的字段;用户通常在访问不必要的字段之前检查存在。我们相信在大多数情况下,不需要现场存在信息。
移除字段存在使得 Proto3 更容易使用开放结构表示来实现,就像在 Android Java (go/nano-proto) 或 Go 等语言中一样。更容易的实施反过来又使其更容易被外部实施者社区访问。
- 如果明确需要此类存在信息,则有几种解决方法,例如包装器、显式 has_field 布尔值。如果需要与 proto2 可选字段向后兼容,也可以使用 Oneof。
推荐阅读
- mysql - 按日期列的功能分组时查询慢
- java - ContentManagerServiceImpl 中构造函数的参数 0 需要一个无法找到的 PropertyFacade' 类型的 bean
- javascript - 在 contentEditable 中插入复杂的 React 组件?
- arrays - 将 tf.cond 与比较两个张量的条件一起使用
- java - 通过获取用户的输入,在 Java 中将时间格式化为 24 小时
- spring - 使用 vaadin 在异步方法中调用 restController
- terraform - terraform 中 aws_iam_policy 资源中条件的语法
- azure - 如何在 CosmosDB 的分区中执行和应用最多(或完全)一个具有 true 标志的实体?
- pytorch - 如何在训练期间更改/重置单个神经元
- r - 查看矢量化对以返回匹配值