【问题标题】:Go Protobuf declarations and optional Fields in Go Struct (string pointers)Go Struct 中的 Go Protobuf 声明和可选字段(字符串指针)
【发布时间】:2023-03-08 14:44:01
【问题描述】:

我在使用 Protoc 和包含可空字符串字段的现有结构时遇到了一点问题。

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

type Message struct {
  Path *string `json:"path"`
}

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

我想出的proto3 声明显然看起来像这样(并且是可选的,因为requiredoptional 已从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 的扩展来执行此操作的任何建议?或者如何描述这个 proto 声明?

【问题讨论】:

    标签: go serialization protocol-buffers protobuf-go


    【解决方案1】:

    即使未设置字段,Proto3 也会返回 Zero Value。目前无法区分是否设置了字段。

    请参阅 Github 问题#15

    可能的解决方案:

    【讨论】:

      【解决方案2】:

      https://stackoverflow.com/a/62566052 proto3 支持可选,带有标志--experimental_allow_proto3_optional

      【讨论】:

        【解决方案3】:

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

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

        我的 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"`
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-02
          • 2019-01-20
          • 2013-09-01
          • 2021-09-20
          • 2019-03-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          相关资源
          最近更新 更多