我在Protoc和包含可空字符串字段的现有结构中遇到了一些问题。
我试图序列化以进行传输的结构包含一组在json中为空的字段(因此我们可以区分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、""、"value")的三重含义。
对于如何在这里进行,或者Go Protobuf是否有一个扩展来这样做,有什么建议吗?或者如何去描述这个原始声明呢?
发布于 2019-07-15 22:05:16
发布于 2021-03-25 07:42:38
https://stackoverflow.com/a/62566052 proto3支持(带标志--experimental_allow_proto3_optional )可选
发布于 2020-05-15 07:46:23
在我的例子中,我用几个包解决了这个问题:
我的proto文件如下:
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"`
}https://stackoverflow.com/questions/57039033
复制相似问题