登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-05 22:22:19 236浏览 收藏

你在学习Golang相关的知识吗?本文《为什么 Go 切片不能用作 Go 映射中的键,就像数组可以用作键一样?》,主要介绍的内容就涉及到golang,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

为什么 Go 切片(它是 Go 数组的一种实现)不能用作 Go 映射中的键,就像数组可以用作键一样?

正确答案

[这是来自https://groups.google.com/forum/#!topic/golang- nuts/zYlx6sR4F8Y](https://groups.google.com/forum/#!topic/golang- nuts/zYlx6sR4F8Y)的 Nigel Tao 的回答:

一个原因是数组是值类型。如果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])

不同的程序员可以有不同的期望。为了避免混淆,我们只是决定暂时不允许切片作为映射键。

以上就是《为什么 Go 切片不能用作 Go 映射中的键,就像数组可以用作键一样?》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表