map 1年前

编程语言
394
map

Go语言map用法

Go语言的 map 数据结构是一种 键值对 的集合 。 通过 key 来访问数据。

map 是使用 hash 表来实现的,所以 map 是无序的,无法决定它的返回顺序。

1 map 的定义

可以使用 var , map 关键字来定义,也可以使用内置的 make()函数来定义

  • 第 1 种 :使用 var , map 定义,语法为: var 名字 map[key的类型] value的类型
  • 第 2 种:使用 make 函数定义,语法为:名字 := make(map[key的类型] value的类型)

使用语法太抽象,直接看下面的例子

示例一 : 使用 var , map 定义

var dict map[string]int

上面声明了一个map dict , key 是 string 类型, 值是 int 类型的 map

注意:直接通过 var 声明的map ,默认是 nil , 不能直赋值, 比如:dict["tom"] = 23 执行时就会报错的。

这一点和切片不一样,nil 切片是可以添加元素的。但是 map 不行

示例二:使用 make() 函数定义

dict := make(map[string]int)

上面直接通过 make() 函数定义了一个map , 此时的 map 不为 nil , 已经分配了内存空间了,是可以正常使用的。

2 map 的读写

map 通过 键(key) 进行读取来赋值。看下面的例子

示例:

func main() {
    
    //键是string,值是int的map
    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22

    fmt.Println( dict )            //输出:map[jim:22 tom:23]
    fmt.Println( dict["tom"] )    //输出:23

    //修改其中一个
    dict["jim"] = 25
    fmt.Println( dict )            //输出:map[jim:25 tom:23]
    fmt.Println( dict["tom"] )    //输出:23
}

3 map 的遍历

前面的循环语句的那一个章节,介绍 for 语句用来循环数组,切片用

本节介绍使用 for 语句,再配合另一个关键字 range 来遍历 map

range 是范围的意思 ,可以配合 for 对数组,切片,map进行遍历

示例: for 结合 range 遍历 map

func main() {

    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22
    dict["bob"] = 27

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

如果只使用 k , 或者 v 中的一个,可以用 _ 把不用的丢弃掉,如下

示例:

func main() {

    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22
    dict["bob"] = 27

    for _, v := range dict {
        fmt.Println(v)
    }
}

//输出如下:
23
22
27

4 查看元素是否存在map中

如上面的例子,如何查看 dict 中是否存在 bob 呢?

一样的示例,如下:

func main() {

    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22
    dict["bob"] = 27

    age , ok := dict["bob"]
    if ok {
        fmt.Println("存在,年龄是:", age)
    }else {
        fmt.Println("不存在")
    }
}

//输出: 存在,年龄是: 27

上面的例子,如果我们换成 bob2 呢,如下:

age , ok := dict["bob2"]
if ok {
    fmt.Println("存在,年龄是:", age)
}else {
    fmt.Println("不存在")
}

//输出:不存在

5 如何删除一个键值对

还是上面的例子,如何想把 bob 删除,怎么做呢?

可以傅内置的 delete() 函数,如下:

func main() {

    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22
    dict["bob"] = 27

    fmt.Println(dict)        //删除前,输出:map[bob:27 jim:22 tom:23]

    delete(dict,"bob")

    fmt.Println(dict)        //删除后,输出:map[jim:22 tom:23]
}

//输出如下:
map[bob:27 jim:22 tom:23]
map[jim:22 tom:23]

由上述可知,dict 少了一个键值对

6 获取map键值对的数量

map 中有多少个键值对,可以使用 内置的len() 函数获取

如下:

func main() {

    dict := make(map[string]int)
    dict["tom"] = 23
    dict["jim"] = 22

    length := len(dict)
    fmt.Println( length )
}

//输出:2

小结

上面介绍了 Go语言中 map 的概念以及用法,下面简单总结一下:

  • map 是一个关键字,是声明 map 用的。

  • map 是无序的键值对集合,是通过 hash 实现的

  • map 的定义有两种方式

    1. 使用 var dict map[string]int 这种方式 ,此时 dict 是 nil ,是不能添加元素的。

    2. 使用 dict := make(map[string]int) 这种方式,此时dict 不为 nil ,是可以添加元素的。

    3. 直接通过 key 来访问元素,比如:dict["tom"] = 23

    4. 查看是否存在某个键值对,可以使用 value, ok := dict["tom"]这种方式。 ok 为 true ,说明存在,此时value 就是 key对应的值

    5. 使用len() 函数获取 map 的键值对的数量

  • map 的遍历 ,使用 for 语句结合 range 关键字,遍历

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223044
累计阅读

热门教程文档

PHP
52小节
Lua
21小节
Spring Cloud
8小节
Vue
25小节
Next
43小节