func main() {
var data = map[string]string{}
data["a"] = "x"
data["b"] = "x"
data["c"] = "x"
fmt.Println(data)
}
它运行。
func main() {
var data = map[string][]string{}
data["a"] = append(data["a"], "x")
data["b"] = append(data["b"], "x")
data["c"] = append(data["c"], "x")
fmt.Println(data)
}
它也运行。
func main() {
var w = map[string]string{}
var data = map[string]map[string]string{}
w["w"] = "x"
data["a"] = w
data["b"] = w
data["c"] = w
fmt.Println(data)
}
它再次运行!
func main() {
var data = map[string]map[string]string{}
data["a"]["w"] = "x"
data["b"]["w"] = "x"
data["c"]["w"] = "x"
fmt.Println(data)
}
但是它失败了!?
Go 中的嵌套地图有问题吗?还是嵌套地图不支持多括号?
原文由 Özgür Yalçın 发布,翻译遵循 CC BY-SA 4.0 许可协议
地图类型的 零值为
nil
。它尚未初始化。您不能将值存储在nil
映射中,这是运行时恐慌。在上一个示例中,您初始化了(外部)
data
映射,但它没有条目。当您像data["a"]
一样对其进行索引时,由于其中没有包含"a"
键的条目,因此对其进行索引会返回值类型的零值,即nil
对于地图。因此,尝试分配给data["a"]["w"]
是运行时恐慌。在将元素存储到其中之前,您必须先初始化地图,例如:
输出(在 Go Playground 上尝试):
请注意,当您声明地图类型的变量并使用 复合文字 对其进行初始化时(如
var data = map[string]string{}
),这也算作初始化。请注意,您还可以使用复合文字初始化嵌套映射:
输出是一样的。在 Go Playground 上尝试一下。