map 是 Go 语言中 ** 键值对(key-value)** 存储的数据结构,类似其他语言的字典、哈希表,查询、插入、删除速度极快,是 Go 最常用的数据类型之一。
一、特性
- key 必须唯一 ,且必须是可比较类型(
int/string/float/bool等,slice/map/function 不能做 key) - value 无限制,可以是任意类型
- 无序存储,遍历顺序不固定
- 零值是
nil,nil map 不能直接赋值,必须先初始化 - 支持自动扩容,无需手动管理容量
二、map 的创建(4 种常用方式)
1. 声明 + 初始化(推荐)
// 方式1:make 函数(最常用)
var m map[string]int = make(map[string]int)
// 简写
m := make(map[string]int)
// 带初始容量(提升性能,避免频繁扩容)
m := make(map[string]int, 10)
2. 直接初始化(带初始值)
// 声明时直接赋值
m := map[string]string{
"name": "张三",
"age": "20",
}
3. 声明空 map
m := map[string]int{}
4. 错误示范(nil map 不能赋值)
// 错误:只声明不初始化,是 nil map,赋值会 panic
var m map[string]int
m["key"] = 100 // panic: assignment to entry in nil map
三、map 基本操作
1. 增 / 改元素
m := make(map[string]int)
// 新增
m["语文"] = 90
m["数学"] = 95
// 修改(key 已存在则覆盖)
m["语文"] = 98
2. 查询元素
// 直接取值
score := m["语文"]
fmt.Println(score) // 98
// 安全取值:判断 key 是否存在(重要!)
score, ok := m["英语"]
if ok {
fmt.Println("分数:", score)
} else {
fmt.Println("该科目不存在")
}
3. 删除元素
使用内置函数 delete()
delete(m, "数学") // 删除 key=数学 的键值对
4. 遍历 map
m := map[string]int{"语文": 98, "数学": 95}
// 遍历 key + value
for k, v := range m {
fmt.Println(k, v)
}
// 只遍历 key
for k := range m {
fmt.Println(k)
}
5. 获取 map 长度
fmt.Println(len(m)) // 2
四、高级用法
1. map 的 value 是切片
// key:string,value:[]int
m := make(map[string][]int)
m["成绩"] = []int{90, 95, 88}
2. map 的 value 是 map
// 嵌套 map
m := make(map[string]map[string]int)
m["学生A"] = map[string]int{"语文": 90}
3. 函数传参(引用传递)
map 是引用类型 ,函数内修改会直接影响原 map,无需指针:
func update(m map[string]int) {
m["数学"] = 100 // 直接修改原 map
}
func main() {
m := map[string]int{"数学": 95}
update(m)
fmt.Println(m) // map[数学:100]
}
示例
package main
import "fmt"
func main() {
// 1.创建map
student := make(map[string]string)
// 2.赋值
student["name"] = "李四"
student["gender"] = "男"
student["age"] = "22"
// 3.查询
name, ok := student["name"]
if ok {
fmt.Println("姓名:",name)
}
gender, ok := student["gender"]
if ok {
fmt.Println("性别:",gender)
}
age, ok := student["age"]
if ok {
fmt.Println("年龄:",age)
}
// 4.遍历
fmt.Println("\n全部信息")
for k, v := range student{
fmt.Println("%s: %s\n", k, v)
}
// 5.删除
delete(student, "age")
fmt.Println("\n删除后的map:", student)
}
