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}]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容