当前位置: 首页 > 面试题库 >

为什么Go切片不能用作Go映射中的键,就像数组可以用作键一样?

邴墨竹
2023-03-14
问题内容

为什么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])

不同的程序员可能会有不同的期望。为避免混淆,我们仅决定暂时不将切片用作地图键。



 类似资料:
  • 问题内容: 如果HashMap的键是字符串数组: 你可以使用新创建的字符串数组访问地图,还是必须是相同的String []对象? 问题答案: 它必须是同一对象。使用和的比较键只有在两个对象相同时才相等。 如果你想要的值相等,然后写一个包装了自己的容器类,并提供了相应的语义和。在这种情况下,最好使容器不可变,因为更改对象的哈希码会对基于哈希的容器类造成破坏。 编辑 正如其他人指出的那样,List 具

  • 问题内容: 这不会执行: 错误消息是: 11-23 11:05:05.298:错误/数据库(31335):准备’创建表TestTable(名称文本,年龄整数,主键(ROWID))’时,0x2ab378上的故障1(表TestTable没有名为ROWID的列)。 但是,在创建TestTable之后,这可以准备并执行: 我可能将其视为需要自动递增主键和外​​键的解决方案,这些主键和外键永远不会用作应用程

  • 问题内容: 可以将切片用作键吗? 我有尝试: 编译器给我一个错误。因此,要么不可能,要么我错误地声明了它(如果可以,那么正确的方法是什么?)。 问题答案: 不可以,切片没有定义相等性,因此无法用作映射键。

  • 我正在使用Visual Studio 2012。我有一张如下所示的地图: 我试图插入这样的数据: 我在编译时遇到了以下错误: microsoft visual studio 11.0\vc\include\utility(182): error C2248: 'std::unique_ptr 我也试过用make_pair插入数据,也有同样的问题。我错过了什么?我已经试着解决这个问题两个小时了,但是

  • 我刚开始在Golang编程,想对一系列地图进行排序。我有一系列地图。让我们称之为示例_数组。 ] 现在我想使用key的值对这个数组进行排序,所以example_array应该修改为- 如果我使用键的值对原始数组进行排序,原始数组应该修改为- 如何在Golang对这些地图阵列进行排序。请帮忙!

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中