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

标签 go serialization protocol-buffers protobuf-go

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

我试图序列化以进行传输的结构包含一堆在 json 中可以为 null 的字段(因此我们可以区分 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 , "", "值")。

关于如何在此处进行的任何建议,或者是否有 Go Protobuf 的扩展来执行此操作?或者如何描述这个原型(prototype)声明?

最佳答案

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

参见 Github 问题 #15 .

可能的解决方案:

关于Go Struct 中的 Go Protobuf 声明和可选字段(字符串指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039033/

相关文章:

php - 转换序列化格式

没有<iostream>的c++ nanopb Protobuff

java - 如何获得 protoc( Protocol Buffer )的预编译 linux 二进制文件?

windows - 从 Go 程序调用 Windows 批处理文件,以便它在新窗口中打开

java - 如何将 RenderedImage 序列化和反序列化为文本字符串?

casting - 在 Go 中将 int 转换为 rune

c++ - 关闭程序后如何从二进制文件中读取字符串

python - 没有导入导致循环依赖?

sockets - 使用 golang 将 JSON 发送到 unix 套接字

go - http.ServeFile 在服务器 golang 上返回 404 not found 错误