我在使用 Protoc 和包含可为空字符串字段的现有结构时遇到了一些问题。
我试图序列化以进行传输的结构包含一堆在 json 中可以为 null 的字段(因此我们可以区分 null
、""
和一个设置值).
type Message struct {
Path *string `json:"path"`
}
因此,如果用户发送一个空的 json 字符串 {}
,路径将为 nil
而不是 ""
,而 { "path":""}
也是有效的,并且与 {"path": null}
不同。
我想出的 proto3
声明显然看起来像这样(并且是可选的,因为 required
和 optional
从 proto3 中删除:
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
, ""
, "值"
)。
关于如何在此处进行的任何建议,或者是否有 Go Protobuf 的扩展来执行此操作?或者如何描述这个原型(prototype)声明?
最佳答案
Proto3 返回 Zero Value即使未设置字段。目前无法区分字段是否已设置。
参见 Github 问题 #15 .
可能的解决方案:
- 使用proto2而不是 proto3 .
- 使用 gogoproto 的 nullable扩展名。
- 使用
google.protobuf.FieldMask
扩展,参见通用设计模式 来自 Google API 设计指南:Partial Responses和 Output Fields .
关于Go Struct 中的 Go Protobuf 声明和可选字段(字符串指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039033/