Go 使用 map


先声明 map

var m1 map[string]string

再使用 make 函数创建一个非 nil 的 map,nil map 不能赋值。

m1 = make(map[string]string)

最后给已声明的 map 赋值

m1["a"] = "aa"
m1["b"] = "bb"

直接创建

m2 := make(map[string]string)

然后赋值

m2["a"] = "aa"
m2["b"] = "bb"

初始化+赋值一体化

m3 := map[string]string{
    "a": "aa",
    "b": "bb",
}

查找键值是否存在

if v, ok := m1["a"]; ok {
    fmt.Println(v)
} else {
    fmt.Println("Key Not Found")
}

遍历 map

for k, v := range m1 {
    fmt.Println(k, v)
}

Go 提供的内置函数 delete,这个函数可以用来从字典中删除元素。

package main

import (
    "fmt"
)

func main() {
    x := make(map[string]int)

    x["A"] = 10
    x["B"] = 20
    x["C"] = 30
    x["D"] = 40

    fmt.Println("Before Delete")
    fmt.Println("Length:", len(x))
    fmt.Println(x)

    delete(x, "A")

    fmt.Println("After Delete")
    fmt.Println("Length:", len(x))
    fmt.Println(x)
}

输出结果为

Before Delete
Length: 4
map[A:10 B:20 C:30 D:40]
After Delete
Length: 3
map[B:20 C:30 D:40]

我们在删除元素前查看一下字典长度和元素,删除之后再看一下。这里面我们还可以看到 len 函数也可以用来获取字典的元素个数。当然如果你试图删除一个不存在的键,那么程序也不会报错,只是不会对字典造成任何影响。

清空 map。

import (
    "fmt"
    "time"
)

func main() {
    testMap := make(map[string]string)
    testMap["k"] = "v"
    fmt.Println(testMap)
    time.Sleep(time.Second * 2)
    for key, value := range testMap {
        fmt.Println(value)
        delete(testMap, key)
    }
    fmt.Println(testMap)
}

原理

func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {
    for ; b != nil; b = b.overflow(t) {
        for i := uintptr(0); i < bucketCnt; i++ {
            b.tophash[i] = empty
            h.count--
        }
    }
}
分享:

评论