登录
首页 >  Golang >  Go问答

在Go Struct中使用字符串指针实现可选字段

来源:stackoverflow

时间:2024-03-22 11:22:31 268浏览 收藏

大家好,今天本人给大家带来文章《在Go Struct中使用字符串指针实现可选字段》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

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

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

type message struct {
  path *string `json:"path"`
}

因此,如果用户发送空 json 字符串 {},则路径将为 nil 而不是 "",而 {"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 是否有扩展来执行此操作?或者如何描述这个原始声明?


解决方案


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

请参阅 Github 问题 #15

可能的解决方案:

https://stackoverflow.com/a/62566052 proto3 支持可选标志 --experimental_allow_proto3_Optional

今天关于《在Go Struct中使用字符串指针实现可选字段》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>