【Go 从入门到精通】第 6 章:字典(map)

【Go 从入门到精通】第 6 章:字典(map)

上一章我们学了数组和切片——它们都是「按下标找元素」:第 0 个、第 1 个、第 2 个……但生活中更多时候我们是「按名字找人」:查「小明的成绩」、查「北京的天气」。这种「键 → 值」的对应关系,Go 里用 map(字典)来表示。

这一章讲 map 的创建、增删改查、遍历,以及它最著名的两个坑:对 nil map 写入会 panic、并发读写会崩。学完这章,你就能轻松应对「按名字查数据」这类需求了。


一、map 是什么:按「名字」找数据

map 是**键值对(key-value)**的集合,像一本字典:根据「键」快速查到「值」。

// key 是 string(名字),value 是 int(分数)
scores := map[string]int{
   
   
    "小明": 90,
    "小红": 85,
}
fmt.Println(scores["小明"]) // 90

对比一下数组/切片和 map 的定位:

结构 怎么找元素 例子
数组 / 切片 按下标(0、1、2…) s[0]
map 按 key(任意可比较类型) scores["小明"]

💡 简单记:数组是「排排坐,按号找」,map 是「按名字,叫谁谁应」。


二、创建 map

2.1 用 make 创建(最常用)

m := make(map[string]int) // key 是 string,value 是 int
m["a"] = 1

map[string]int 表示「键是 string、值是 int 的 map」,冒号前后分别是 key 和 value 的类型。

💡 make 还可以带第二个参数预估容量:make(map[string]int, 100) 表示「预计装 100 个键值对」,提前分配好底层空间、减少后续扩容次数。注意这只是预估(hint),不是硬性上限——超过 100 个照样能存。

2.2 用字面量创建(带初始值)

m := map[string]int{
   
   
    "a": 1,
    "b": 2,
}

注意上面最后一行 "b": 2, 末尾的逗号不能省——Go 规定:多行复合字面量里,最后一个元素后必须有逗号。如果写成单行,最后一个元素后的逗号可以省略:

m := map[string]int{
   
   "a": 1, "b": 2} // ✅ 单行可以省略末尾逗号

2.3 nil map:只声明不初始化(大坑!)

map 的零值是 nil只声明不初始化的 map 是 nil,向它写入会直接 panic

var m map[string]int // m 是 nil map
m["a"] = 1           // ❌ panic: assignment to entry in nil map

⚠️ 重点:声明后必须用 make 或字面量初始化才能写:

var m map[string]int
m = make(map[string]int) // 先初始化
m["a"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phpgolife

谢谢您的支持,您是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值