Go Map


先声明 map

var m1 map[string]string

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

make 函数会分配和初始化一个哈希 map 数据结构,并返回一个指向该哈希 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)
}

map 引用不存在的 key,会返回初始值。

package main

import (
    "fmt"
)

func main() {
    newMap := make(map[string]int)
    fmt.Println(newMap["a"])
}

map 使用 range 遍历顺序问题,并不是录入的顺序,而是随机顺序。

package main

import (
    "fmt"
)

func main() {
    newMap := make(map[int]int)
    for i := 0; i < 10; i++ {
        newMap[i] = i
    }
    for key, value := range newMap {
        fmt.Printf("key is %d, value is %d\n", key, value)
    }
}

输出

key is 7, value is 7
key is 8, value is 8
key is 0, value is 0
key is 1, value is 1
key is 3, value is 3
key is 5, value is 5
key is 6, value is 6
key is 2, value is 2
key is 4, value is 4
key is 9, value is 9

不能对 map 中的某个元素进行取地址 & 操作

a := &ages["bob"]
// compile error: cannot take address of map element

map 中的元素不是一个变量,不能对 map 的元素进行取地址操作,禁止对 map 进行取地址操作的原因可能是 map 随着元素的增加 map 可能会重新分配内存空间,这样会导致原来的地址无效。

package main

import "fmt"

func main() {
    var i byte
    for i = 0; i <= 255; i++ {
        fmt.Println("here")
    }
}
分享:

评论