package main import ( "fmt" "math" "sync" ) func main() { // 映射创建 m1 := make(map[string]int) // make创建 m2 := map[string]int{ // 字面量初始化 "apple": 5, "banana": 3, } // 添加和修改元素 m1["orange"] = 2 m2["apple"] = 6 // 修改已有键的值 // 访问元素 fmt.Println("m1[orange]:", m1["orange"]) // 2 fmt.Println("m2[banana]:", m2["banana"]) // 3 // 判断键是否存在 v, ok := m2["orange"] if ok { fmt.Printf("orange count: %d\n", v) } else { fmt.Println("orange not found") // 输出该结果 } // 删除元素 delete(m2, "banana") fmt.Println("删除后m2[banana]:", m2["banana"]) // 0(零值) // 映射长度 fmt.Println("m2长度:", len(m2)) // 1 // 映射遍历(无序) fmt.Println("map遍历:") for fruit, count := range m2 { fmt.Printf("%s: %d\n", fruit, count) // 顺序不固定 } // 映射的键类型限制 var m3 map[int]string // 整数 var m4 map[string]bool // 字符串 var m5 map[bool]int // 布尔值 var m6 map[[3]int]string // 数组(元素类型也必须可比较) // 结构体作为键(所有字段都必须可比较) type Point struct { X, Y int } var m7 map[Point]string fmt.Printf("m3:%T, m4:%T, m5:%T\n", m3, m4, m5) fmt.Printf("m6:%T, m7:%T\n", m6, m7) // 特殊情况:NaN作为键(每个NaN都是唯一的) m := map[float64]string{} nan1 := math.NaN() nan2 := math.NaN() m[nan1] = "first" m[nan2] = "second" fmt.Println("NaN映射长度:", len(m)) // 2 // 并发安全映射(sync.Map) var m8 sync.Map m8.Store("cat", 2) // 存储键值对 m8.Store("dog", 1) // 读取与删除 if v, ok := m8.Load("cat"); ok { fmt.Printf("cat count: %d\n", v) // 输出2 } m8.Delete("dog") }