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

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


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


type Message struct {

  Path *string `json:"path"`

}

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


proto3我提出的声明显然看起来像这样(并且是可选的,并且required从optionalproto3 中删除了:


syntax = "proto3";

message Message {

  string Path = 1;

}

运行 Protoc 后,我最终得到一个如下所示的结构,所有值都是,string并且无法将它们声明为*string:


type Message struct {

  Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`

}

显然我无法从现有的结构中分配给这个数组。但即使我要使用适当的空指针检查等来编写繁琐的映射代码,我target.Path = *source.Path也会失去源结构的三重含义(nil、、)。"""value"


关于如何继续这里的任何建议,或者 Go Protobuf 是否有扩展来执行此操作?或者如何描述这个原始声明?


皈依舞
浏览 290回答 3
3回答

慕虎7371278

即使未设置字段,Proto3 也会返回零值。目前无法区分某个字段是否已设置。可能的解决方案:使用proto2而不是proto3。使用 gogoproto 的可为空扩展。使用google.protobuf.FieldMask扩展,请参阅 Google API 设计指南中的常见设计模式:部分响应和输出字段。

梦里花落0921

proto3 支持可选带标志--experimental_allow_proto3_optional

Smart猫小萌

就我而言,我用几个包解决了这个问题:https://github.com/gogo/protobufhttps://github.com/golang/protobuf我的原型文件如下所示: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 代码的命令如下所示:protoc -I. -I%GOPATH%/src --gogofaster_out=plugins=grpc:. proto/*.proto生成的go文件如下所示:type Message struct {    Path *string `protobuf:"bytes,1,opt,name=path,json=path,proto3,wktptr" json:"path,omitempty"`}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go