面试题答案
一键面试键类型限制条件
- 可比较性:Go语言中,map的键类型必须是可比较的类型。即该类型必须支持
==
和!=
操作符。这是因为map内部需要通过比较键来确定元素的位置和查找元素。 - 不可变:键类型的值在作为map键使用期间不能改变。虽然Go语言并没有严格意义上不可变类型的概念,但从实际使用角度,可比较的类型往往是不可变的,例如基本类型(整数、浮点数、字符串),指针,具名结构体等。
举例说明某些类型不能作为键
- 切片类型:切片类型不能作为map的键,因为切片是不可比较的。虽然从逻辑上看可以比较两个切片的内容是否相同,但Go语言中并没有为切片定义
==
和!=
操作符。例如:
package main
func main() {
// 以下代码会编译错误
// var m map[[]int]int
// m = make(map[[]int]int)
}
- map类型:map类型本身也是不可比较的,因此不能作为map的键。原因同切片,没有为map定义
==
和!=
操作符。例如:
package main
func main() {
// 以下代码会编译错误
// var m map[map[string]int]int
// m = make(map[map[string]int]int)
}
- 函数类型:函数类型同样不可比较,不能作为map的键。例如:
package main
func main() {
// 以下代码会编译错误
// var m map[func() int]int
// m = make(map[func() int]int)
}
可作为键的类型示例:
package main
import "fmt"
func main() {
m := make(map[string]int)
m["key1"] = 100
fmt.Println(m["key1"])
type Point struct {
x int
y int
}
m2 := make(map[Point]int)
p := Point{1, 2}
m2[p] = 200
fmt.Println(m2[p])
}
在上述示例中,字符串和具名结构体 Point
都可作为map的键,因为它们都是可比较的。