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
相关推荐
程序员爱钓鱼24 分钟前
Go 编程实战:函数 Function——参数、返回值与代码复用
后端·面试·go
艾莉丝努力练剑1 小时前
【AI接入大模型SDK】ChatSDK示例验证
人工智能·学习·面试·大模型·sdk
To_OC6 小时前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
东风破_6 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_6 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
Lyyaoo.7 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
剩下了什么7 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
Rain的Java大神之路7 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
码匠许师傅10 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
IT_陈寒11 小时前
Vue的响应式什么时候会失灵?这个坑我踩了
前端·人工智能·后端