Go 整数的协议缓冲区零值
我有一个Go结构,我们目前在restful API中使用的结构如下所示:Go 整数的协议缓冲区零值,go,protocol-buffers,grpc,Go,Protocol Buffers,Grpc,我有一个Go结构,我们目前在restful API中使用的结构如下所示: type Req struct { Amount *int } 我在这里使用指针,因为如果金额为零,则表示未填充金额;如果金额不是零,但为零,则表示字段已填充,但值为零 当我们开始更改为protofile并希望使用它时,主API将请求作为HTTP API获取,并通过gRPC将其发送到下一个服务,使用我遇到的相同的protofile,proto3无法生成金额指针。这很好,因为协议缓冲区是为在分离的系统之间发送数据而设计
type Req struct {
Amount *int
}
我在这里使用指针,因为如果金额为零,则表示未填充金额
;如果金额不是零,但为零,则表示字段已填充,但值为零
当我们开始更改为protofile并希望使用它时,主API将请求作为HTTP API获取,并通过gRPC将其发送到下一个服务,使用我遇到的相同的protofile,
proto3
无法生成金额指针。这很好,因为协议缓冲区是为在分离的系统之间发送数据而设计的,但我如何处理上述问题,因为如果我收到请求,我无法确定数量是零还是零 proto3
不区分零和无;默认值和隐式与显式值的概念消失了:
- 默认值始终为零(或false等)
- 如果值为零,则不发送;否则就是
proto2
,您所追求的更有可能。或者,只需添加一个单独的字段,以指示您对某个内容具有值:
消息请求{
整数金额=1;
bool amountHasValue=2;
}
或者使用嵌套的子消息,即
messagefoo{
Bar=1;
}
消息栏{
整数金额=1;
}
(因此,没有值,您只发送一个
Foo
;有值,您发送一个Foo
,带有Bar
,无论数量是多少,它都是)主要是指我们的用例需要proto2。谢谢