Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 整数的协议缓冲区零值_Go_Protocol Buffers_Grpc - Fatal编程技术网

Go 整数的协议缓冲区零值

Go 整数的协议缓冲区零值,go,protocol-buffers,grpc,Go,Protocol Buffers,Grpc,我有一个Go结构,我们目前在restful API中使用的结构如下所示: type Req struct { Amount *int } 我在这里使用指针,因为如果金额为零,则表示未填充金额;如果金额不是零,但为零,则表示字段已填充,但值为零 当我们开始更改为protofile并希望使用它时,主API将请求作为HTTP API获取,并通过gRPC将其发送到下一个服务,使用我遇到的相同的protofile,proto3无法生成金额指针。这很好,因为协议缓冲区是为在分离的系统之间发送数据而设计

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

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。谢谢