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


    一.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,分配内存后才能赋值和使用

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

     对上述代码的说明:

    1.map在使用前一定要make

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

    3.map的value可以是相同的

    4.map的key-value是无序的

     三.map的使用

    1. package main
    2. import (
    3.     "fmt"
    4. )
    5. func main()  {
    6.     //第一种使用方式
    7.     var a map[string]string
    8.     //在使用map前,需要先make,make的作用是给map分配数据空间
    9.     a = make(map[string]string, 10)
    10.     a["name"] = "张三"
    11.     a["name1"] = "张三1"
    12.     a["name"] = "李四"
    13.     fmt.Println(a)
    14.     //推荐使用:第二种使用方式
    15.     cities := make(map[string]string)
    16.     cities["c1"] = "北京"
    17.     cities["c2"] = "上海"
    18.     cities["c3"] = "广州"
    19.     fmt.Println(cities)
    20.     //第三种使用方式
    21.     var heros map[string]string = map[string]string{
    22.         "h1":"张三",
    23.         "h2":"李四",  //最后一个逗号不能少
    24.     }
    25.     // heros := map[string]string {
    26.     //  "h1":"张三",
    27.     //  "h2":"李四",
    28.     // }
    29.     heros["h3"] = "王五"
    30.     fmt.Println(heros)
    31. }

    练习

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

    四.crud操作

    1. package main
    2. import (
    3.     "fmt"
    4. )
    5. func main()  {
    6.     //增加,修改
    7.     cities := make(map[string]string)
    8.     cities["c1"] = "北京"
    9.     cities["c2"] = "上海"
    10.     cities["c3"] = "广州"
    11.     fmt.Println(cities)
    12.     //因为c1这个key已经存在,故下面的是修改
    13.     cities["c1"] = "重庆"
    14.     fmt.Println(cities)
    15.     //删除
    16.     delete(cities, "c1")
    17.     fmt.Println(cities)
    18.     //当delete指定的key不存在时,删除不会操作,也不会报错
    19.     delete(cities, "c4")
    20.     fmt.Println(cities)
    21. }

    map删除

            说明:

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

     细节说明

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

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

     map的查找

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

    五.遍历

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

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

    1. package main
    2. import (
    3.     "fmt"
    4. )
    5. func main() {
    6.     //使用for-range遍历
    7.     var a map[string]string
    8.     a = make(map[string]string)
    9.     a["name"] = "张三"
    10.     a["name1"] = "张三1"
    11.     a["name"] = "李四"
    12.     fmt.Println(a)
    13.     for k, v := range a {
    14.         fmt.Printf("k=%v,v=%v\n",k, v)
    15.     }
    16.     //使用for-range遍历比较复杂的map
    17.     /**
    18.      * 案例: 演示一个key-value:
    19.      *       存放三个学生消息,每个学生有姓名,性别
    20.      *       思路: map[string]map[string]string
    21.     */
    22.     students := make(map[string]map[string]string)
    23.     students["0001"] = make(map[string]string, 2)
    24.     students["0001"]["name"] = "张三"
    25.     students["0001"]["sex"] = "男"
    26.     students["0002"] = make(map[string]string, 2)
    27.     students["0002"]["name"] = "赵敏"
    28.     students["0002"]["sex"] = "女"
    29.     fmt.Println(students)
    30.     fmt.Println()
    31.     for key, val := range students {
    32.         fmt.Printf("key=%v\n", key)
    33.         for k, v := range val {
    34.             fmt.Printf("\t k=%v, v=%v\n", k,v)
    35.         }
    36.     }
    37. }

     

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

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

  • 相关阅读:
    Java括号匹配
    rsync远程同步
    初识 RabbitMQ
    将CSV、Excel、XML文件转换为MySQL数据库
    手把手带你学SQL—牛客网SQL 别名
    MySQL场景面试,你是如何进行SQL优化的?
    HTML入门知识点
    什么是radis
    9.17-数值分析
    如何在 Tomcat 中为 Web 应用程序启用和配置缓存?
  • 原文地址:https://blog.csdn.net/zhoupenghui168/article/details/125509145