插入地图时Go(深)复制键吗?

use*_*783 4 dictionary key go

我有一个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

edu*_*911 6

简短的回答,它被复制了.

根据规范,数组是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)

指针不匹配.

编辑:真正的原因是当插入地图时,键值被复制.或者,您可以继续记住上面的规则:数组是值类型,它们的重用表示副本.要么在这里工作.:)