我有一个嵌套映射,看起来像这样
[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{}
类型,但是它抱怨我不能覆盖它(接口类型为{}的变量)。
这真的不清楚你想做什么,但这是我从你的问题中推断出来的:
- 你有数据在切片/数组
- 该数据可以表示为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输入的字段为兼容类型。