厚土Go学习笔记 | 23. map字典的使用

时间:2022-05-06
本文章向大家介绍厚土Go学习笔记 | 23. map字典的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

map是一组键和值的组合。在map内是无序的。你可以随时加入或删除一个键及键对应的值。

想查看所有键值,使用range遍历好了。

想找到唯一的键值,那要使用键来得到值。

map的创建必须使用make

m := make(map [string]int)

我们可以把这个map当作是一组人的名字和年龄,然后这样写入键值。

m := make(map [string]int)
m["Anna"] = 16
m["Tom"] = 15
m["Smith"] = 17

直接打印map

fmt.Println(m)

运行结果

map[Anna:16 Tom:15 Smith:17]

如果需要挨个分析处理,那么需要遍历,并且判断后再加上处理语句。比如,我们给值为 17 的加一个特殊的显示标记“* --> ”

//遍历,分别处理
for k, v := range m {
    if v == 17 {fmt.Print("* --> ")}
    fmt.Println(k, v)
}

当然,你也可以直接对你感兴趣的map键调用。

m["Anna"] = 17
fmt.Println(m)

这个时候的打印输出就会发现,Anna的值也是 17 了。

如果,你只是想判断一下,map内是否已经有某个键了,可以这样写

kv, ok := m["anna"]
fmt.Println(kv, ok)
kv1, ok1 := m["Anna"]
fmt.Println(kv1, ok1)

查看输出的结果。比较就会发现,当键不存在时,返回的值为零值,而同时我们得到了一个 false 的检测结果。我们可以使用这个方法来判断map中某个键是否存在。

我们还需要知道,如何删除一个已经存在的元素。很简单的,只要直接 delete就行。像这样

delete(m, "Anna")
fmt.Println(m)

观察打印结果,发现 Anna 已经不见了。

完整代码

package main

import "fmt"

func main() {
    m := make(map [string]int)
    m["Anna"] = 16
    m["Tom"] = 15
    m["Smith"] = 17

    fmt.Println(m)

    //遍历,分别处理
    for k, v := range m {
        if v == 17 {fmt.Print("* --> ")}
        fmt.Println(k, v)
    }

    m["Anna"] = 17
    fmt.Println(m)

    kv, ok := m["anna"]
    fmt.Println(kv, ok)
    kv1, ok1 := m["Anna"]
    fmt.Println(kv1, ok1)

    delete(m, "Anna")
    fmt.Println(m)
}

运行结果

map[Anna:16 Tom:15 Smith:17]
Anna 16
Tom 15
* --> Smith 17
map[Anna:17 Tom:15 Smith:17]
0 false
17 true
map[Tom:15 Smith:17]

下面来展示一个复杂一点的例子。map元素值的类型是一个结构体。

package main

import (
    "fmt"
)

type Vertex struct {
    Lat, Long float64
}

var m map[string]Vertex

func main() {
    m = make(map[string]Vertex)
    m["Bell Labs"] = Vertex{
        40.68433, -74.39967,
    }
    m["Bei Jing"] = Vertex{39.26, 115.25}
    fmt.Println(m)
    fmt.Println("--------I'm just a line.---------------")
    for lat, _ := range m {
        fmt.Println(lat, ":", m[lat].Lat, m[lat].Long)
    }
    delete(m, "Bei Jing")
    fmt.Println(m)
}

运行结果

map[Bell Labs:{40.68433 -74.39967} Bei Jing:{39.26 115.25}]
--------I'm just a line.---------------
Bell Labs : 40.68433 -74.39967
Bei Jing : 39.26 115.25
map[Bell Labs:{40.68433 -74.39967}]