为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
皈依舞 2023-07-04 15:41:23
我在 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 设计指南中的常见设计模式:部分响应和输出字段。


查看完整回答
反对 回复 2023-07-04
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

proto3 支持可选带标志--experimental_allow_proto3_optional



查看完整回答
反对 回复 2023-07-04
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

就我而言,我用几个包解决了这个问题:

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

  2. https://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"`

}


查看完整回答
反对 回复 2023-07-04
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信