Golang中 map的key可以用数组array类型吗?map的key可以用切片slice类型吗?
golang 中 map 的 key 必须是可以比较的,再简单点也就是说,map的key是可以使用 == 运算符进行比较的。
因slice,map,function 不可以比较,所以不能作为key
所以 数字、string、bool、array数组、channel、指针可以,以及 包含前面类型的 struct。
为什么slice、map、function不能直接用==比较?
切片比较:
var a []int
var b []int
(a == b)
报错:invalid operation: a == b (slice can only be compared to nil)。
map比较:
m_1 := map[int]int{}
m_2 := map[int]int{}
if m_1 == m_2 {
("equal")
}
报错:m_1 == m_2 (map can only be compared to nil)
原因是由于切片,因为切片是引用类型,并且不可比较,为啥不可比较,有两个原因:
1、引用类型,比较地址没有意义。
2、切片有len,cap,比较的维度不好衡量,因此go设计的时候就不允许切片可比较。
由于map中的value可以是slice,这就使得包含slice的结构包括函数,结构体等,也是不可比较的。注意:这里的结构体不可比较指的是包含slice的结构体!
因此map是不可比较的,自然不能作为map的key,而value是任意类型。