是否可以在包含地图名称的同时编组一个 go 结构?

Posted

技术标签:

【中文标题】是否可以在包含地图名称的同时编组一个 go 结构?【英文标题】:Is it possible to Marshal a go struct while including a map name? 【发布时间】:2020-10-15 19:00:52 【问题描述】:

假设我有一个这样设置的 go 结构:

type TestStruct struct 
    ID string
    ConfigTest         map[string]Object
    

对象内部有 yaml/json 标签,用于编组(然后保存到文件中),如下所示:

type Object struct 
    ID          string  `yaml:"ID"`
    Value       float64 `yaml:"Value"`

所以,当我编组 TestStruct.ConfigTest,并使用 ioutil.WriteFile() 将其保存到文件中时,我得到如下输出:

obj1:
    ID: "Hello"
    Value: 1.2
obj2:
    ID: "World"
    Value: 3.4
...(etc)

但我真正想要的是编组,并像这样保存文件:

Objects:  
    obj1:
        ID: "Hello"
        Value: 1.2
    obj2:
        ID: "World"
        Value: 3.4
    ...(etc)

这可能吗?

【问题讨论】:

【参考方案1】:

您有两个基本选择:

重用TestStruct:

更改 TestStruct 以在字段上添加适当的标签:一个跳过封送 ID,另一个将所需的名称提供给 ConfigTest

type TestStruct struct 
  ID string                             `yaml:"-"`
  ConfigTest         map[string]Object  `yaml:"Objects"`

使用包装结构:

如果您不能或不想修改TestStruct(即:因为它已经在其他地方封送),您可以使用包装结构:

type WrapperStruct struct 
  ConfigTest         map[string]Object  `yaml:"Objects"`

并编组您的新包装器结构,而不是 MyStruct

【讨论】:

字段上的标签可以按需编辑吗?也就是说,在给定特定的函数调用或 if/else 语句的情况下,是否可以选择可以/不能编组的内容? 我问的是,因为 TestStruct 结构可能会填充更多的实体,如 ConfigTest,所以我只想在我喜欢的时候整理出特定的实体。 我不认为结构标签可以用反射来操作。如果你需要,你可能想要做一些部分自定义的编组(例如:编组 TestStruct.ConfigTest 并按照你需要的方式修改输出)。

以上是关于是否可以在包含地图名称的同时编组一个 go 结构?的主要内容,如果未能解决你的问题,请参考以下文章

将包含 int 和 int[] 的结构从 C# 编组到 C++

编组包含 c 字符串的结构

包含字节数组的编组结构

部分 JSON 在 Go 中解组为地图

如何将 C++ 本机对象编组到托管 C++ CLI

部分JSON解组到Go中的地图中