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

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

Map · Go语言中文文档

map[Key]Value

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

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

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

  • 基本数据类型: bool、int(及其各种变体如 int8、uint64 等)、float32、float64、complex、string
  • 指针类型(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
相关推荐
柠檬味拥抱几秒前
皮肤病变检测数据集 | 2500张YOLO皮肤科数据集
后端
我的xiaodoujiao7 分钟前
Django 基础知识详细图文教程 16-Django 内置Admin认证系统
后端·python·django
程序员鱼皮10 分钟前
Personal Agent 是什么?为什么大厂都抢着做?连 DeepSeek Bot 都来了。。
前端·后端·ai编程
geovindu17 分钟前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
m0_5873830017 分钟前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
dd聊技术19 分钟前
给检索改动装一盏红绿灯:评测门禁怎么建、怎么用
人工智能·后端
acd1200924 分钟前
Go 里 err 被不经意覆盖的几个现场
开发语言·后端·golang
合尘猫28 分钟前
给客服系统加一道闸:把「该转人工」从模糊判断变成可测拦截
人工智能·后端·程序员
掘金者阿豪42 分钟前
数据集成软件不能只看“同步成功”:聊聊金仓 KFS 和订单数据同步这件事
前端·后端
我的div丢了肿么办43 分钟前
go语言通过反射来操作结构体中的数据
后端·go