我有一个map复杂的键 - 例如,2D数组:
m := make(map[[2][3]int]int)
Run Code Online (Sandbox Code Playgroud)
当我在地图中插入新密钥时,Go是否会对密钥进行深层复制?
a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
m[a] = 1
Run Code Online (Sandbox Code Playgroud)
换句话说,如果我在将数组a用作地图键后更改数组,地图是否仍包含旧值a?
简短的回答,它被复制了.
根据规范,数组是value types.
Go的数组是值.数组变量表示整个数组; 它不是指向第一个数组元素的指针(如C中的情况).这意味着当您分配或传递数组值时,您将复制其内容.(为了避免复制,你可以传递指向数组的指针,但那是指向数组的指针,而不是数组.) https://blog.golang.org/go-slices-usage-and-internals
你自己看:
https://play.golang.org/p/fEUYWwN-pm
package main
import (
"fmt"
)
func main() {
m := make(map[[2][3]int]int)
a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
fmt.Printf("Pointer to a: %p\n", &a)
m[a] = 1
for k, _ := range m {
fmt.Printf("Pointer to k: %p\n", &k)
}
}
Run Code Online (Sandbox Code Playgroud)
指针不匹配.
编辑:真正的原因是当插入地图时,键值被复制.或者,您可以继续记住上面的规则:数组是值类型,它们的重用表示副本.要么在这里工作.:)