79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
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")
|
||
}
|