为什么Go切片(这是Go数组的实现)不能用作Go映射中的键,几乎不能像将数组用作键一样?
这是陶洁儿(Nigel Tao)在https://groups.google.com/forum/#!topic/golang- nuts/zYlx6sR4F8Y的回答:
原因之一是数组是值类型。如果a0是[N]int(数组),则执行 a1 := a0 a1[0] = 0 完全不会影响a0[0]。 相比之下,切片指的是基础数组。复制切片值是O(1)而不是O(length)。如果s0是[]int(一片)然后 s1 := s0 s1[0] = 0 会影响什么s0[0]。 http://play.golang.org/p/TVkntIsLo8 映射键需要一些相等的概念。对于数组,这只是元素方面的相等。对于切片,定义平等的方法不止一种:一种是元素方式的平等,另一种是指相同的数组后备存储。此外,地图插入是否需要对整个后备阵列进行(昂贵的)复制?复制可能不会那么令人惊讶,但是与分配的工作不一致。 此代码段应打印什么? m := make(map[[]int]bool) s0 := []int{6, 7, 8} s1 := []int{6, 7, 8} s2 := s0 m[s0] = true s2[0] = 9 println(m[s0]) println(m[s1]) println(m[s2]) 不同的程序员可能会有不同的期望。为避免混淆,我们仅决定暂时不将切片用作地图键。
原因之一是数组是值类型。如果a0是[N]int(数组),则执行
a0
[N]int
a1 := a0 a1[0] = 0
完全不会影响a0[0]。
a0[0]
相比之下,切片指的是基础数组。复制切片值是O(1)而不是O(length)。如果s0是[]int(一片)然后
s0
[]int
s1 := s0 s1[0] = 0
会影响什么s0[0]。
s0[0]
http://play.golang.org/p/TVkntIsLo8
映射键需要一些相等的概念。对于数组,这只是元素方面的相等。对于切片,定义平等的方法不止一种:一种是元素方式的平等,另一种是指相同的数组后备存储。此外,地图插入是否需要对整个后备阵列进行(昂贵的)复制?复制可能不会那么令人惊讶,但是与分配的工作不一致。
此代码段应打印什么?
m := make(map[[]int]bool) s0 := []int{6, 7, 8} s1 := []int{6, 7, 8} s2 := s0 m[s0] = true s2[0] = 9 println(m[s0]) println(m[s1]) println(m[s2])
不同的程序员可能会有不同的期望。为避免混淆,我们仅决定暂时不将切片用作地图键。