Z
ZHANK
复合类型

映射 Map

map[K]V 哈希表、make 初始化、comma ok 惯用法、delete

映射 Map

Go 的 map 是哈希表,使用前必须 make 初始化。读取不存在的 key 返回零值——不会抛异常。

学完本章你将: 掌握 map[K]V、make 初始化、comma ok 惯用法、delete。


创建与使用

go
package main

import "fmt"

func main() {
    // make 创建
    ages := make(map[string]int)

    // 赋值
    ages["小明"] = 25
    ages["小红"] = 22

    // 字面量初始化
    scores := map[string]int{
        "数学": 92,
        "语文": 88,
    }

    fmt.Println(ages["小明"])  // 25
}

comma ok 惯用法 —— 判断 key 是否存在

go
// 直接取——不存在的 key 返回零值
age := ages["不存在"]   // 0(int 的零值)

// comma ok 惯用法:区分"不存在"和"值为零值"
if age, ok := ages["小明"]; ok {
    fmt.Println("年龄:", age)
} else {
    fmt.Println("不存在")
}

遍历与删除

go
// 遍历(顺序是随机的!)
for name, age := range ages {
    fmt.Printf("%s → %d\n", name, age)
}

// 删除
delete(ages, "小明")

// 安全地边遍历边删除
for key := range ages {
    if shouldDelete(key) {
        delete(ages, key)
    }
}

nil map 陷阱

go
var m map[string]int  // nil map
// m["key"] = 1        // ❌ panic!  nil map 不能写

// 读取 nil map 不会 panic(返回零值)
fmt.Println(m["key"])  // 0(静默返回)

⚠️ 在使用前始终初始化 map: m := make(map[string]int) 或用字面量。