首页 / Go 语言入门教程 / map 基础

Go 语言入门教程

map 基础

本教程共 80 篇 · 第 32 篇 · 更新于 2026-07-27 · 约 7 分钟阅读

GoGo 入门教程map字典键值对make

32. map 基础

本节目标:学会声明和创建 map,掌握增删改查四项基本操作,理解 map 的零值行为。

map 是什么

map(映射)就是键值对(key-value)的集合。给一个 key,能快速找到对应的 value。你可以把它想成一本通讯录:名字是 key,电话号码是 value。

Go 的 map 写法是 map[KeyType]ValueType,比如 map[string]int 表示 key 是字符串、value 是整数的 map。

创建 map 的三种方式

方式一:make

m := make(map[string]int)
m["apple"] = 5
m["banana"] = 3
fmt.Println(m) // map[apple:5 banana:3]

make(map[string]int) 创建一个空 map,可以直接用。

方式二:字面量

m := map[string]int{
    "apple":  5,
    "banana": 3,
    "cherry": 8,
}
fmt.Println(m) // map[apple:5 banana:3 cherry:8]

注意每个键值对后面都要加逗号,包括最后一个。

方式三:var 声明(不能用)

var m map[string]int
m["apple"] = 5 // 报错!panic: assignment to entry in nil map
Warning

var m map[string]int 声明出来的 map 是 nil。nil map 可以读(返回零值),但不能写。必须用 make 或字面量初始化后才能写入。

增删改查

增加

直接赋值就行,key 不存在就新增:

m := make(map[string]int)
m["apple"] = 5
m["banana"] = 3

修改

key 已存在的话,赋值就是覆盖:

m["apple"] = 10 // 把 apple 的值从5改成10

查询

用 key 取值,配合「逗号 ok」模式判断 key 是否存在:

package main

import "fmt"

func main() {
    m := map[string]int{"apple": 5, "banana": 3}

    // 方式一:直接取,不存在返回零值
    fmt.Println(m["apple"])  // 5
    fmt.Println(m["cherry"]) // 0  不存在返回int的零值

    // 方式二:逗号ok模式,能区分"零值"和"不存在"
    v, ok := m["cherry"]
    if ok {
        fmt.Println("cherry:", v)
    } else {
        fmt.Println("cherry 不存在")
    }
}
Tip

逗号 ok 模式非常重要。如果 map 里存的值本身可以是 0,你光看返回值 0 是没法区分「这个 key 不存在」还是「这个 key 的值就是 0」的。用 v, ok := m[key] 就能准确判断。

删除

用内置函数 delete

m := map[string]int{"apple": 5, "banana": 3}
delete(m, "apple")
fmt.Println(m) // map[banana:3]

// 删除不存在的key也不会报错
delete(m, "notexist")

map 的基本特性

长度

len() 获取 map 里键值对的数量:

m := map[string]int{"a": 1, "b": 2, "c": 3}
fmt.Println(len(m)) // 3

引用类型

和切片一样,map 也是引用类型。赋值给另一个变量,两者共享同一份数据:

m1 := map[string]int{"apple": 5}
m2 := m1

m2["apple"] = 100
fmt.Println(m1["apple"]) // 100  m1 也变了

key 的类型限制

map 的 key 必须是可比较的类型,也就是支持 == 操作的类型。可以用的有:

  • 数字、字符串、布尔
  • 数组、指针、channel
  • 接口(如果底层类型可比较)
  • 结构体(如果所有字段可比较)

不能用的有:

  • 切片
  • map
  • 函数

这些类型不可比较,所以不能做 key。

Note

浮点数虽然可以做 key,但不推荐。浮点数有精度问题,NaN != NaN,可能导致意想不到的行为。

小结

map 的核心操作就四个字:增删改查。

  • 创建用 make 或字面量,别用 var
  • 增和改都是 m[key] = value
  • 查用 v, ok := m[key] 判断存在性
  • 删用 delete(m, key)

下一章讲 map 的进阶用法:遍历顺序、嵌套 map、以及 key 选择的注意事项。