Golang:为map接口声明一个类型,这样我就可以循环并转换为struct

umuewwlo  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(93)

我有一个嵌套的Map,如下所示

[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{}类型,但是它抱怨我不能覆盖它(interface{}类型的变量)。

6tqwzwtp

6tqwzwtp1#

我真的不清楚你想做什么,但我从你的问题中推断出了以下结论:
1.数据位于片/数组中
1.此数据可表示为结构
这意味着我们可以安全地创建以下类型:

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 num\n", d.Name, d.Num)
}

应该够了。考虑到你的类型,还有你提到的map[string][]map[string]int之类的东西(或map[string][]map[string]interface{}),我看不出有什么理由要使用map。看一下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只要求Map到JSON输入的字段是兼容类型。

相关问题