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中的嵌套贴图有问题吗?或者,嵌套映射不支持多括号吗?

推荐答案

贴图类型的zero valuenil.它尚未初始化.您不能在nil映射中存储值,这是运行时panic .

在上一个示例中,您初始化(外部)data映射,但它没有条目.当您为其编制索引(如data["a"])时,由于其中还没有包含"a"键的条目,因此对其进行索引将返回值类型的零值,即映射的值类型为nil.因此,试图赋值给data["a"]["w"]是一种运行时panic .

在将元素存储到映射之前,您必须先初始化映射,例如:

var data = map[string]map[string]string{}

data["a"] = map[string]string{}
data["b"] = make(map[string]string)
data["c"] = make(map[string]string)

data["a"]["w"] = "x"
data["b"]["w"] = "x"
data["c"]["w"] = "x"
fmt.Println(data)

输出(在Go Playground上试用):

map[a:map[w:x] b:map[w:x] c:map[w:x]]

请注意,当您声明一个映射类型的变量并将其初始化为composite literal(如在var data = map[string]string{}中)时,这也算作初始化.

请注意,您也可以使用复合文字来初始化嵌套映射:

var data = map[string]map[string]string{
    "a": map[string]string{},
    "b": map[string]string{},
    "c": map[string]string{},
}

data["a"]["w"] = "x"
data["b"]["w"] = "x"
data["c"]["w"] = "x"
fmt.Println(data)

输出是相同的.在Go Playground号公路上试试吧.

Go相关问答推荐

如何在Go中使用a-h/tempson渲染预格式的内容?

如何获得与cksum相同的CRC 32?

在Go中根据命名空间/字符串生成UUID

使用ciph.AEAD.Seal()查看内存使用情况

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

从文件读取字节,将其保存到 struct 体并修改值

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

这是实现超时的常见方法,为什么 time.After 不起作用

hyperledger fabric - go:在 $PATH 中找不到可执行文件

我无法使用反向代理更改主机标头

Golang crypto/rand 线程安全吗?

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

为什么互斥量比 golang 中的通道慢?

使用自定义处理程序 nats golang 保留订阅方法

如何将一片 map 转换为一片具有不同属性的 struct

有没有办法将 yaml node 添加到 golang 中现有的 yaml 文档中?

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

在删除级联时无法在 Gorm 中按预期工作

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别

如何在测试中传递用户名和密码等参数