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默认值的主要内容,如果未能解决你的问题,请参考以下文章

Golang中设置函数默认参数的优雅实现

手撸golang GO与微服务 grpc

如何安装golang的grpc插件

Golang gRPC 示例

gRPC最佳入门教程,Golang/Python/PHP多语言讲解

读golang的grpc源码