Go 中的结构映射与结构数组

标签 map struct go slice

假设我有一个带有字符串属性 b 的简单结构 a:

type A struct {
    B string
}

以下代码使用 A 类型的数组:

testArray := []A{A{}}
testArray[0].B = "test1"
fmt.Println(testArray[0].B)

将按预期打印出“test1”。

但是这段看起来同样简单的代码:

testMap := make(map[string]A)
testMap["key"] = A{}
testMap["key"].B = "test2"
fmt.Println(testMap["key"].B)

不会打印出“test2”,而是会导致以下错误:

cannot assign to testMap["key"].B

那么,为什么分配给 map 中的子属性会导致错误,而分配给数组中的子属性会按预期工作?我想知道为什么这对 map 不起作用以及为什么它对数组有效。我也很想猜测为什么他们设计的语言具有两种数据结构之间的这种差异。

最佳答案

我在邮件列表中做了一些详细的回答,但简短的解释是这不起作用,因为 map 条目不可寻址。这意味着您不能获取 map 中条目的地址。这是因为向 map 添加新值可能会导致 map 条目四处移动,从而导致地址发生变化。因为您不能获取映射中条目的地址,所以所有映射操作都使用整值:从映射中复制整值,将整值添加到映射。分配给映射中结构的一个字段需要读取-修改-写入操作,映射不支持(它们可以,但它们不支持,并且支持它们是有成本的)。

数组和 slice 中的元素是可寻址的,因为它们在创建后不会移动。

关于Go 中的结构映射与结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18083044/

相关文章:

map - 提供多种不同风格的平铺 map

c++ - std::map 是如何实现的,所以它可以要求它的 key_type 具有可比性?

ios - 存储和检索 API 调用的数据

c - 我如何利用结构数组根据用户输入输出给定的结构

xml - golang xml解码

java - 通过索引检索 Map 的键

java - 如何初始化一个public static final read-only Linked Map(双向图)

c - 结构与 ptr 数组嵌套结构分配和内存分配

csv - 如何制作与 `cut` 一样高效的 TSV 处理 golang 程序?

go - 在 IntelliJ 中导入 Go 项目不起作用