Golang中的map的key可以是哪些类型?可以嵌套map吗?

Golang中的map的key可以是哪些类型?可以嵌套map吗?

Map · Go语言中文文档

map[Key]Value

Key 必须是可比较的类型 :只有支持 ==!= 操作符的类型才能作为 map 的 Key

1. 哪些类型可以作为 Map 的 Key?

✅ 合法的 Key 类型(可比较)

  • 基本数据类型: boolint(及其各种变体如 int8uint64 等)、float32float64complexstring
  • 指针类型(Pointer): 指向同一内存地址的指针是相等的
  • 通道类型(Channel): 使用 make 创建的同一个 channel 是相等的
  • 接口类型(Interface): 前提是接口所绑定的动态类型本身是可比较的(如果在运行时绑定了不可比较的类型,会引发 panic)
  • 数组(Array): 前提是数组内部的元素类型是可比较的(注意:数组是定长的,如 [3]int
  • 结构体(Struct): 前提是结构体内部的所有字段都是可比较的类型

❌ 非法的 Key 类型(不可比较)

  • 切片(Slice): []T(因为切片的底层是指针、长度和容量,它的内容随时可能变化,比较它们没有意义且容易出错)
  • 映射(Map): map[K]V
  • 函数(Func): func()

2. 可以嵌套 Map 吗?

完全可以。 map 的 Value 可以是任何类型,当然也包括另一个 map

⚠️ 嵌套 Map 的致命易错点: 外层 map 初始化后,如果直接对内层 map 赋值,会引发 panic: assignment to entry in nil map。内层 map 在使用前必须单独被初始化。

代码演示👀

1. String 作为 key
go 复制代码
strMap := map[string]int{"Alice": 90, "Bob": 85}
fmt.Println(strMap) // map[Alice:90 Bob:85]
2. Struct 作为 key (非常实用,常用于坐标或复合主键)
go 复制代码
type Point struct {
	X int
	Y int
}
pointMap := map[Point]string{
        {X: 0, Y: 0}: "Origin",
        {X: 1, Y: 2}: "Point A",
}
fmt.Println(pointMap) // map[{0 0}:Origin {1 2}:Point A]
fmt.Println("坐标 (1,2) 对应的是:", pointMap[Point{1, 2}]) // Point A
3. Array 作为 key (注意是数组 3int,不是切片 \[\]int)
go 复制代码
arrayMap := map[[3]int]string{
        {1, 2, 3}: "Sequence One",
}
fmt.Println(arrayMap) // map[[1 2 3]:Sequence One]

sliceMap := map[[]int]string{}
fmt.Println(sliceMap) // invalid map key type []int
嵌套 Map 及其正确初始化方式
go 复制代码
// 定义一个嵌套 Map:外层 key 是班级(string),内层是 学生姓名(string) -> 分数(int)
nestedMap := make(map[string]map[string]int)

nestedMap["ClassA"]["Alice"] = 95 // 【错误写法】 panic: assignment to entry in nil map

// 必须先初始化内层的 Map
nestedMap["ClassA"] = make(map[string]int)

// 向内层 Map 添加数据了
nestedMap["ClassA"]["Alice"] = 95
nestedMap["ClassA"]["Bob"] = 88

// 再加一个班级
nestedMap["ClassB"] = make(map[string]int)
nestedMap["ClassB"]["Charlie"] = 70

fmt.Println("Nested Map 全貌:", nestedMap)                         // map[ClassA:map[Alice:95 Bob:88] ClassB:map[Charlie:70]]
fmt.Println("ClassA 中 Alice 的分数:", nestedMap["ClassA"]["Alice"]) // Alice 的分数: 95
相关推荐
小小猪的春天23 分钟前
AI 编程 30 天实验复盘:效率提升 65%,线上 bug 涨到 11 个,问题出在哪
后端
爱勇宝38 分钟前
3位工程师靠“删AI代码”创业,一周收费1万美元:以后最贵的能力,可能不是写代码
前端·后端·架构
不能放弃治疗1 小时前
rule 和 skill
后端
雾行0x001 小时前
Go 指南:一篇文章速通 Golang
go
ADIT1 小时前
一、反射的定义与原理
后端
Csvn2 小时前
Python 开发技巧:标准库深度挖掘
后端·python
山东点狮信息科技有限公司2 小时前
SpringBoot+VUE3,一套系统完成OA+HRM+CRM+MES+合同+项目管理 —— 深度解析点狮全业务管理平台
java·spring boot·后端
爱勇宝2 小时前
《道德经》第4章,老子写得很像在描述一个“底层系统”。
前端·后端·程序员