← Backend / Go / 基础专题

14_map映射与键值查找

创建映射、检查键是否存在,并理解 nil map 与迭代顺序。

Go 基础专题 14:map 映射与键值查找

学习目标:创建映射、检查键是否存在,并理解 nil map 与迭代顺序。

核心知识

map[K]V 以键查找值,键类型必须可比较,例如字符串、整数或元素可比较的结构体。make(map[string]int) 创建可写 map;也可用字面量 map[string]int{"Ada": 90}。读取不存在的键会得到值类型的零值,所以要用“值,存在”形式区分缺失和真正的 0。

package main

import "fmt"

func main() {
    scores := map[string]int{"Ada": 90}
    score, exists := scores["Lin"]
    fmt.Println(score, exists) // 0 false
    scores["Lin"] = 85
    delete(scores, "Ada")
    fmt.Println(len(scores))
}

var scores map[string]int 的零值是 nil,可读取、可取长度,但不能赋值;写入前要 make。map 是引用语义的数据结构,赋值给另一变量不会复制全部键值。Go 的 map 迭代顺序没有保证,需要稳定输出时收集键并排序。

并发读写同一个 map 需要同步,不能因为不同 goroutine 操作不同键就假设安全。可使用互斥锁或由单个 goroutine 管理 map;sync.Map 只适合特定共享模式。

逐步理解

读取 scores["Lin"] 时,零值 0 不能证明键存在,所以示例同时检查 exists。如果业务允许得分 0,更要保留这个布尔值。map 的赋值会共享底层映射,若要独立副本可遍历键值并逐项复制。对包含指针或切片的值,逐项复制仍可能只复制引用。

动手练习

练习:统计 []string{"go","py","go"} 的次数。答案要点:循环里 counts[word]++,不存在的键从零值开始。