我在 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 是否有扩展来执行此操作?或者如何描述这个原始声明?
3 回答
慕虎7371278
TA贡献1802条经验 获得超4个赞
即使未设置字段,Proto3 也会返回零值。目前无法区分某个字段是否已设置。
可能的解决方案:
使用proto2而不是proto3。
使用 gogoproto 的可为空扩展。
使用
google.protobuf.FieldMask
扩展,请参阅 Google API 设计指南中的常见设计模式:部分响应和输出字段。
Smart猫小萌
TA贡献1911条经验 获得超7个赞
就我而言,我用几个包解决了这个问题:
我的原型文件如下所示:
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"`
}
- 3 回答
- 0 关注
- 266 浏览
添加回答
举报
0/150
提交
取消