[go学习笔记.第九章.map] 1.map的介绍,声明,使用方式,crud操作以及遍历

发布时间:2023-02-28 18:00

一.map的基本介绍

        map是key-value数据结构,又称为字段或者关联数组.类似于其它编程语言的集合,在编程中进程使用

二.map的声明

1.基本语法 

var map变量名 map[keytype]valuetype

keytype可以是什么类型?

        go中的map的key可以是多种类型:bool,数字(整数,浮点数),string,指针,channel,还可以是只包含前面几种类型的接口,结构体,数组

        key的类型通常为int,string

注意:  slice,map还有function不可以作为key,因为这几个没法用 == 来判断

keytype可以是什么类型?

        valuetype的类型和key基本一样,通常为数字(整数,浮点数),string,map,struct

2.map声明举例

 var a map[string]string

 var a map[string]int

 var a map[int]string

 var a map[string]map[string]string 

注意: 声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用

func main() {
    //map的声明和注意事项
    var a map[string]string
    //当声明map后,直接输出,结果:map[]
    fmt.Println(a)  //map[]
    //如果直接给map赋值,会报错:panic: assignment to entry in nil map(没有给map分配数据空间)
    // a["name"] = "张三"
    //在使用map前,需要先make,make的作用是给map分配数据空间
    a = make(map[string]string, 10)
    a["name"] = "张三"
    a["name1"] = "张三1"
    a["name"] = "李四"
    fmt.Println(a)
}

 对上述代码的说明:

1.map在使用前一定要make

2.map的key是不能重复的,如果重复了,则以最后这个key-value为准

3.map的value可以是相同的

4.map的key-value是无序的

[go学习笔记.第九章.map] 1.map的介绍,声明,使用方式,crud操作以及遍历_第1张图片 三.map的使用

package main

import (
    "fmt"
)

func main()  {
    //第一种使用方式
    var a map[string]string
    //在使用map前,需要先make,make的作用是给map分配数据空间
    a = make(map[string]string, 10)
    a["name"] = "张三"
    a["name1"] = "张三1"
    a["name"] = "李四"
    fmt.Println(a)

    //推荐使用:第二种使用方式
    cities := make(map[string]string)
    cities["c1"] = "北京"
    cities["c2"] = "上海"
    cities["c3"] = "广州"
    fmt.Println(cities)

    //第三种使用方式
    var heros map[string]string = map[string]string{
        "h1":"张三",
        "h2":"李四",  //最后一个逗号不能少
    }
    // heros := map[string]string {
    //  "h1":"张三",
    //  "h2":"李四",
    // }
    heros["h3"] = "王五"
    fmt.Println(heros)
}

练习

    /**
     *  案例: 演示一个key-value:
     *       存放三个学生消息,每个学生有姓名,性别
     *       思路: map[string]map[string]string
     */
    students := make(map[string]map[string]string)
    students["0001"] = make(map[string]string, 2)
    students["0001"]["name"] = "张三"
    students["0001"]["sex"] = "男"
    students["0002"] = make(map[string]string, 2)
    students["0002"]["name"] = "赵敏"
    students["0002"]["sex"] = "女"
    fmt.Println(students)

四.crud操作

package main

import (
    "fmt"
)

func main()  {
    //增加,修改
    cities := make(map[string]string)
    cities["c1"] = "北京"
    cities["c2"] = "上海"
    cities["c3"] = "广州"
    fmt.Println(cities)
    //因为c1这个key已经存在,故下面的是修改
    cities["c1"] = "重庆"
    fmt.Println(cities)

    //删除
    delete(cities, "c1")
    fmt.Println(cities)
    //当delete指定的key不存在时,删除不会操作,也不会报错
    delete(cities, "c4")
    fmt.Println(cities)
}

map删除

        说明:

                delete(map,key),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,就不操作,但也不报错

[go学习笔记.第九章.map] 1.map的介绍,声明,使用方式,crud操作以及遍历_第2张图片

 细节说明

        如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除或者map = make(...),make一个新的,让原来的成为垃圾,被GC回收

    //如果希望一次性删除所有的key
    //1.变遍历所有的key,再足个删除
    //2.直接make一个新的空间
    cities := make(map[string]string)
    fmt.Println(cities)

 map的查找

    //演示map的查找
    val, ok := cities["c1"]
    if ok {
        fmt.Printf("存在c1这个key,值为%v\n", val)
    } else {
        fmt.Println("不存在c1这个key")
    }

五.遍历

案例演示一个相对复杂的map遍历,该map的value又是一个map

说明:map的遍历使用for-range的结构遍历

package main

import (
    "fmt"
)

func main() {
    //使用for-range遍历
    var a map[string]string
    a = make(map[string]string)
    a["name"] = "张三"
    a["name1"] = "张三1"
    a["name"] = "李四"
    fmt.Println(a)
    for k, v := range a {
        fmt.Printf("k=%v,v=%v\n",k, v)
    }

    //使用for-range遍历比较复杂的map
    /**
     * 案例: 演示一个key-value:
     *       存放三个学生消息,每个学生有姓名,性别
     *       思路: map[string]map[string]string
     */
    students := make(map[string]map[string]string)
    students["0001"] = make(map[string]string, 2)
    students["0001"]["name"] = "张三"
    students["0001"]["sex"] = "男"
    students["0002"] = make(map[string]string, 2)
    students["0002"]["name"] = "赵敏"
    students["0002"]["sex"] = "女"
    fmt.Println(students)
    fmt.Println()
    for key, val := range students {
        fmt.Printf("key=%v\n", key)
        for k, v := range val {
            fmt.Printf("\t k=%v, v=%v\n", k,v)
        }
    }
}

 [go学习笔记.第九章.map] 1.map的介绍,声明,使用方式,crud操作以及遍历_第3张图片

    //统计map长度
    a := make(map[int]int,2)
    a[1] = 1
    a[2] = 2
    fmt.Println("a中有", len(a), "对key-value")

[上一节][go学习笔记.第八章.排序和查找] 3.二维数组练习

[下一节][go学习笔记.第九章.map] 2.map的切片,排序以及注意事项 

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号