假设我有一个带有字符串属性 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/