使用for循环创建[] map [string]接口{}时出错->恐慌:在nil map中分配给条目

问题描述 投票:1回答:1

我正在尝试使用类似的循环来构建[] map [string]接口{}:

package main

import (
    "encoding/json"
    "fmt"
)

type People []struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    resp := `[{"name":"Test","age":15}, {"name":"Test2","age":25}]`
    data := &People{}
    _ = json.Unmarshal([]byte(resp), data)
    m := make([]map[string]interface{}, len(*data))
    for k, v := range *data {
        m[k]["Name"] = v.Name
        m[k]["Age"] = v.Age
    }
    fmt.Println(m)
    fmt.Printf("%T", m)
}

但是我总是收到此错误:

恐慌:在nil映射中分配给条目

goroutine 1 [正在运行]:main.main()/tmp/sandbox300360207/prog.go:19 + 0x17a

我不能使用m := make(People, len(*data))m[k].Name = v.Name,因为我需要类型为[]map[string]interface{}而不是main.People

我也尝试过:

func main() {
    resp := `[{"name":"Test","age":15}, {"name":"Test2","age":25}]`
    data := &People{}
    _ = json.Unmarshal([]byte(resp), data)
    m := make([]map[string]interface{}, len(*data))
    for k, v := range *data {
        m[k] = map[string]interface{"Name": v.Name, "Age": v.Age}
    }
    fmt.Println(m)
    fmt.Printf("%T", m)
}

但是出现此错误:

./ prog.go:19:31:语法错误:意外的文字“名称”,应为 方法或接口名称

arrays loops for-loop go slice
1个回答
0
投票

您的make()仅创建一片地图,但其元素均为nil。您不能将配对“插入”到nil映射中,还必须在循环内创建映射:

m := make([]map[string]interface{}, len(*data))
for k, v := range *data {
    m[k] = make(map[string]interface{})
    m[k]["Name"] = v.Name
    m[k]["Age"] = v.Age
}

输出将是(在Go Playground上尝试):

[map[Age:15 Name:Test] map[Age:25 Name:Test2]]
[]map[string]interface {}

或者,您可以使用复合文字来创建地图:

m[k] = map[string]interface{}{}

并且使用单个复合文字,其外观如下:

for k, v := range *data {
    m[k] = map[string]interface{}{
        "Name": v.Name,
        "Age":  v.Age,
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.