Golang gRPC默认值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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还是要留空。
我可以添加两个布尔值,说明客户是否设置了发件人和发件人,但是我觉得应该有一个比这更优雅的解决方案。
是否有一种方法可以真正找出客户端是否打算发送空值,或者是否将值实际设置为0
?对于字符串等,""
也是如此。
答案
您无法区分缺少的字段和在proto3中设置为其默认值的字段。这是设计使然。在Issue 1606中引用xfxyjwf:
删除proto3中场的存在的理由:
proto2中的字段存在引起混乱,并且使语义变得复杂,例如一必须区分缺失字段和设置为其默认值的字段;用户通常在访问字段之前检查是否存在,这是不必要的。我们相信在大多数情况下,不需要现场状态信息。
消除字段的存在使使用开放结构的Proto3更加容易实现表示形式,例如android Java(go / nano-proto)或Go等语言。更容易实施反过来使外部实施者社区可以更好地访问它。
- 如果明确需要此类状态信息,则有几种解决方法,例如包装,显式has_field布尔值。如果与proto2可选的向后电线兼容,也可以使用其中一个必填字段。
以上是关于Golang gRPC默认值的主要内容,如果未能解决你的问题,请参考以下文章