golang 中,map的key通常是字符串类型。
但这不是必须的,任何可比较的类型,例如 boolean, integer, float, complex, string,channel,pointer
,甚至用户自定义struct类型,都可以作为key。
具体的可比较类型,可以参考:https://go.dev/ref/spec#Comparison_operators
用于定义 map 键的类型必须是可比较的,这样才能够确定两个相同类型的键是否相等。
基本类型作为key
基本类型(整型、浮点型、字符串、布尔型等)都可以作为 map 的键因为它们都支持相等性比较。
func main() {
// 整数作为键
mapInt := map[int]string{
1: "Jack",
2: "Lucy",
}
// 字符串作为键
mapString := map[string]int{
"Jack": 100,
"Lucy": 80,
}
// 布尔值作为键
mapBool := map[bool]string{
true: "真",
false: "假",
}
fmt.Println(mapInt, mapString, mapBool)
}
指针作为key
func main() {
type Student struct {
Name string
Score int
}
// 指针作为key
jack := &Student{"Jack", 100}
lucy := &Student{"Lucy", 80}
mapPointer := map[*Student]string{
jack: "分数为100",
lucy: "分数为80",
}
fmt.Println(mapPointer)
}
//输出:
//map[0xc000094060:Alice's pointer 0xc000094078:Bob's pointer]
结构体作为key
func main() {
type Student struct {
Name string
Score int
}
// Struct作为key
student := Student{
Name: "Jack",
Score: 100,
}
mapStruct := map[Student]string{
student: "姓名Jack,成绩为100分",
}
fmt.Println(mapStruct)
}
数组和接口作为key
同样数组和接口也可以作为key。
只有数组中的元素是可以比较的,或接口实际存储的类型是可以比较的即可。
不能作为map中key的类型
- 切片类型,切片是引用类型,不能使用
==
操作符进行比较。。 - 函数类型,不能使用
==
操作符进行比较。 - map 类型,map 类型不能作为 map 的键,因为也是引用类型,不能使用
==
操作符进行比较。。