map和slice底层为何没有实现比较;slice有下标所以有序,map读取无序,存储应该也是有序的。不可比较原因是什么?
原理上是可行的,之所以不把他们定义为可比较(comparable
) 主要是为了避免一些歧义吧,试想一下,如果他们是可比较的,那我可不可以把它作为 map 的 key 呢?想象这样的一段代码
a := make(map[[]int]struct{}, 0)
i := []int{1, 2, 3}
j := i
a[i] = struct{}{}
a[j] = struct{}{}
j[0] = 0
不同于数组,切片只是指向底层数组的一个指针,在执行完 j[0] = 0
后 map 的 key 也会改变,这是不可理愈的。
如果一个可比较的类型不能作为 map 的 key ,那它为什么要被定义为可比较呢?
除此之外,是否相等的定义也是很难定义的,比如 make([]int64, 0, 10)
和 make([]int64, 0, 9)
是否相等呢