我正在尝试使用类似的循环来构建[] 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:语法错误:意外的文字“名称”,应为 方法或接口名称
您的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,
}
}