Golang:声明映射接口的类型.我可以循环它并转换为struct



我有一个嵌套映射,看起来像这样

[map[datas:map[a:1 aaaa:1 blue:1 bb:1 green:1 cc:1 dd:1 red:1 ee:4 ff:2 gg:1]]]

如何将其表示为类型?例如

type datas map[string][]map[string]int

我的最终目标是像这样转换这个结构体

type DataStruct struct {
Datas []struct {
Name  string `json:"name"`
Num int    `json:"num"`
} `json:"datass"`
}

为了做到这一点,我需要遍历映射。现在我已经将它声明为type DatasType map[string]interface{}类型,但是它抱怨我不能覆盖它(接口类型为{}的变量)。

这真的不清楚你想做什么,但这是我从你的问题中推断出来的:

  1. 你有数据在切片/数组
  2. 该数据可以表示为struct

这意味着我们可以安全地创建以下类型:

type Data struct {
Name string `json:"name"`
Num  int    `json:"num"`
}
type DataSet struct {
Set []Data `json:"datas"`
}

现在假设您正在尝试(反)编组看起来像这样的数据:

{
"datas": [
{
"foo",
123,
},
{
"bar",
456,
},
]
}

你可以简单地这样做:

set := DataSet{}
if err := json.Unmarshal(&set, input); err != nil {
// handle error
}
for _, d := range set.Data {
fmt.Printf("Name %s has %d numn", d.Name, d.Num)
}

应该足够了。考虑到你的类型,以及你提到的map[string][]map[string]int(或map[string][]map[string]interface{})之类的东西,我看不出你为什么要费心使用地图。类型map[string][]map[string]any转换为JSON对象,其中字段是对象的数组(或切片)。看看DataSet类型,它表示一个对象,其字段是对象的数组/切片。这正是你所拥有的,因此这就是你所需要的。

当你无法知道你正在处理的数据是什么格式和/或类型时,你唯一需要处理像map[string]any这样的东西的时候。然后,如果你不知道你在做什么,你必须问:你能合理地期望你做什么有价值的事情?

同样值得注意的是:如果您的输入JSON对象包含您的结构/类型不包含的字段,json.Unmarshal将简单地忽略这些字段,所以如果您的输入看起来像这样:

{
"random": "string value",
"another_dataset": {}, // some object|
"datas": [], // this is what you're after
// ... more fields
}

上面的DataSet对象仍然可以正常工作。json.Unmarshal只要求映射到JSON输入的字段为兼容类型。

相关内容

  • 没有找到相关文章

最新更新