是否可以在包含地图名称的同时编组一个 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 结构?的主要内容,如果未能解决你的问题,请参考以下文章