首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go结构中的Go Protobuf声明和可选字段(字符串指针)

Go结构中的Go Protobuf声明和可选字段(字符串指针)
EN

Stack Overflow用户
提问于 2019-07-15 11:43:35
回答 3查看 10.2K关注 0票数 8

我在Protoc和包含可空字符串字段的现有结构中遇到了一些问题。

我试图序列化以进行传输的结构包含一组在json中为空的字段(因此我们可以区分null""和一个设置值)。

代码语言:javascript
复制
type Message struct {
  Path *string `json:"path"`
}

因此,如果用户发送空的json字符串{},路径将是nil而不是"",而{"path":""}也是有效的,并且与{"path": null}的情况不同。

我提出的proto3声明显然是这样的( requiredoptional从proto3中删除时是可选的):

代码语言:javascript
复制
syntax = "proto3";
message Message {
  string Path = 1;
}

在运行Protoc之后,我得到了一个类似于下面的结构,所有的值都是string,无法将它们声明为*string

代码语言:javascript
复制
type Message struct {
  Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`
}

显然,我不能从我现有的结构中分配给这个数组。但是,即使我用target.Path = *source.Path编写冗长的映射代码,使用适当的空指针检查等等,我也会取消源结构(nil"""value")的三重含义。

对于如何在这里进行,或者Go Protobuf是否有一个扩展来这样做,有什么建议吗?或者如何去描述这个原始声明呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-15 22:05:16

即使没有设置字段,Proto3也会返回零值。目前,无法区分是否设置了字段。

请参阅Github发行的#15

可能的解决方案:

票数 7
EN

Stack Overflow用户

发布于 2021-03-25 07:42:38

https://stackoverflow.com/a/62566052 proto3支持(带标志--experimental_allow_proto3_optional )可选

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 07:46:23

在我的例子中,我用几个包解决了这个问题:

  1. https://github.com/gogo/protobuf
  2. https://github.com/golang/protobuf

我的proto文件如下:

代码语言:javascript
复制
syntax = "proto3";

import "google/protobuf/wrappers.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

message Message {
  google.protobuf.StringValue path = 1 [(gogoproto.wktpointer) = true];
}

生成go代码的命令如下所示:

代码语言:javascript
复制
protoc -I. -I%GOPATH%/src --gogofaster_out=plugins=grpc:. proto/*.proto

生成的go文件如下所示:

代码语言:javascript
复制
type Message struct {
    Path *string `protobuf:"bytes,1,opt,name=path,json=path,proto3,wktptr" json:"path,omitempty"`
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57039033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档