【问题标题】:Protocol buffer zero value for integer整数的协议缓冲区零值
【发布时间】:2019-02-04 21:32:27
【问题描述】:

我有一个 Go 结构,我们目前在我们的 RESTful API 中使用它,如下所示:

type Req struct {
  Amount *int
}

我这里用的是指针,因为如果Amount是nil,说明Amount没有填,如果Amount不是nil,但是是0,说明这个字段被填了,但是值是零。

当我们开始更改为 protofiles 并希望使用它时,主 API 将请求作为 HTTP API 获取,并通过 gRPC 将其发送到下一个服务,使用与我遇到问题相同的 protofile,proto3无法为金额生成指针。这很好,因为协议缓冲区是为在分离的系统之间发送数据而设计的,但是我该如何处理上述问题,因为如果我收到请求,我无法确定 Amount 是 nil 还是为零。

【问题讨论】:

    标签: go protocol-buffers grpc


    【解决方案1】:

    proto3 不区分零和不存在;默认值和隐式值与显式值的概念消失了:

    • 默认值始终为零(或 false 等)
    • 如果值为零,则不发送;否则,它是

    proto2 让您所追求的更加可能。或者,只需添加一个 单独的 字段来表明您对某事有一个价值:

    message Req {
        int amount = 1;
        bool amountHasValue = 2;
    }
    

    或者使用嵌套的子消息,即

    message Foo {
        Bar bar = 1;
    }
    message Bar {
        int amount = 1;
    }
    

    (所以;如果没有值,你只是发送一个Foo;有一个值,你发送一个带有BarFoo,无论amount是什么:它是)

    【讨论】:

    • 这主要意味着我们的用例需要 proto2。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多