协议缓冲区零值(整数)

时间:2019-02-04 13:13:47

标签: go protocol-buffers grpc

我有一个Go结构,它在我们的Restful API中目前正在使用的样子,

type Req struct {
  Amount *int
}

我在这里使用指针,因为如果Amount为零,则表示Amount未填充;如果Amount为零,但为零,则表示字段已填充,但是值为零。

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

1 个答案:

答案 0 :(得分:1)

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

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

proto2可以为您提供更多服务。另外,只需添加一个 separate 字段以表明您具有某物的值:

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

或使用嵌套的子消息,即

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

(因此;如果没有值,您将正义发送一个Foo;通过一个值,您将发送一个带有Foo的{​​{1}},无论{ {1}}是:是)