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 的键,因为也是引用类型,不能使用==操作符进行比较。。