• Golang的高级数据类型-字典(map)实战篇


              Golang的高级数据类型-字典(map)实战篇

                                 作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

     

     

      Go语言字典和数组,切片一样,是来保存一组相同的数据类型的。可以通过key键来获取value值,map为映射关系容器,采用散列(hash)实现。

      如果数据存在频繁删除操作的话,尽量不要使用切片,map删除数据效率要比切片好,如果数据需要排序,切片和数组比map好,因为map是无序的。

     

    一.字典(map)的定义

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        /*
    
            声明字典结构语法如下:
                var 字典 map[键类型]值类型
    
            定义字典结构使用map关键字,"[]"中指定的是键(key)的类型,后面紧跟着的是值(value)的类型。
    
            温馨提示:
                map中的key值除了切片,函数,复数(complex)以及包含切片的结构体都可以,换句话说,使用这些类型会造成编译错误。
                map在使用前也需要使用make函数进行初始化。
                map没有容量属性,map只有长度属性,长度表示的是map中key和value有多少对。
                map满足集合的特性,即key是不能重复的
        */
    
        //声明一个字典类型
        var m1 map[string]string
        //map在使用前必须初始化空间,和切片类似的是map自身也没有空间哟~
        m1 = make(map[string]string)
        //注意,key和value都是字符串类型
        m1["Name"] = "Jason Yin"
        //注意,上一行已经定义"Name"这个key名称了,再次使用同名key会将上一个key对应的value进行覆盖
        m1["Name"] = "尹正杰"
        fmt.Printf("m1的数据类型是:%T,对应的长度是:%d
    ", m1, len(m1))
        fmt.Println("m1的数据是:", m1)
    
        //使用自动推到类型并初始化空间
        m2 := make(map[string]int)
        //注意key是字符串类型,而vlaue是int类型
        m2["Age"] = 18
        fmt.Printf("m2的数据类型是:%T,对应的长度是:%d
    ", m2, len(m2))
        fmt.Println("m2的数据是:", m2)
    
        //直接初始化空间并赋初始值
        m3 := map[string]rune{"first": '', "second": '', "third": ''}
        fmt.Printf("m3的数据类型是:%T,对应的长度是:%d
    ", m3, len(m3))
        fmt.Println("m3的数据是:", m3)
    }

    二.字典(map)的基本操作

    1>.字典(map)的访问方式(查询)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        m1 := map[string]rune{"first": '', "second": '', "third": ''}
    
        //第一种访问方式,可以通过key值访问
        fmt.Println("===== 第一种访问方式 =====")
        fmt.Println(m1["first"])
    
        //第二种访问方式,可以通过变量名访问所有数据
        fmt.Println("===== 第二种访问方式 =====")
        fmt.Println(m1)
    
        //第三种访问方式,同时拿到key和value
        fmt.Println("===== 第三种访问方式 =====")
        for key, value := range m1 {
            fmt.Println("key值是:", key, ",value值是:", value)
        }
    
        //第四种访问方式,只拿到key,基于key去范围其对应的value
        fmt.Println("===== 第四种访问方式 =====")
        for key := range m1 {
            fmt.Println("key值是:", key, ",value值是:", m1[key])
        }
    
        //第五种访问方式,判断一个map是否有key,基于返回的bool值做相应的操作
        fmt.Println("===== 第五种访问方式 =====")
        value, flag := m1["first"]
        if flag {
            fmt.Println("key的值为:", value)
        }
    }

    2>.字典(map)的增删改操作

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        m1 := map[string]rune{"first": '', "second": '', "third": ''}
    
        //增加map键值
        fmt.Println("增加key之前:", m1)
        m1["test"] = 666666
        fmt.Println("增加key之后:", m1)
    
        //更新键值,
        m1["test"] = 88888888
        fmt.Println("更新key之后:", m1)
    
        //删除键值,Go语言种delete函数只是删除map种元素的作用
        delete(m1, "test")
        fmt.Println("删除key之后:", m1)
    
    }

    3>.字典(map)的嵌套

    package main
    
    import (
        "fmt"
    )
    
    func main() {
    
        m1 := map[string]rune{"first": '', "second": '', "third": ''}
    
        /*
            定义一个嵌套数据类型
        */
        m2 := make(map[string]map[string]int32)
    
        //我们可以为嵌套类型赋值
        m2["name"] = m1
        fmt.Println("m1的数据为:", m1)
        fmt.Println("m2的数据为:", m2)
    
    }

    三.字典(map)作为函数参数

    package main
    
    import (
        "fmt"
    )
    
    func Rename(m map[string]string) {
        //为传递进来的map增加一个key.
        m["name"] = "Jason Yin"
        fmt.Printf("Rename函数中的m地址为:%p
    ", m)
    }
    
    func main() {
        /*
            在Go语言中,数组作为参数进行传递时值传递,而切片作为参数进行传递时引用传递。
                值传递:
                    方法调用时,实参数把他的值传递给对应的形式参数,方法执行中形式参数值的改变不会影响实际参数的值。
                引用传递(也称为传地址):
                    函数调用时,实际参数的引用(地址,而不是参数的值)被传递给函数中相对应的形式参数(实参与形参指向了同一块存储区域);
                    在函数执行时,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变会影响实际参数的值。
    
            map作为函数参数传递实际上和切片传递一样,传递的是地址,也就是我们常说的引用传递.
    
            温馨提示:
                (1)说白了,只要先使用make进行初始化操作再使用的类型,在函数传递时基本上都是引用传递哟~
                (2)在我们日常开发中,常见引用传递的高级数据类型有切片,字典(map)和管道(channel).
        */
        m1 := make(map[string]string)
    
        fmt.Println("调用前的m1数据为:", m1)
        fmt.Printf("main函数中的m1地址为:%p
    ", m1)
        
        Rename(m1)
    
        fmt.Println("调用后的m1数据为:", m1)
    }

  • 相关阅读:
    mysql 查找数组格式的字符串中是否包含某个值
    假期总结
    shell循环结构解析:for/while/case
    ansible笔记(15):循环(二)with_items/with_list/with_together/with_flattened
    ansible笔记(14):循环(一)
    解决报错Failed to start LSB: Bring up/down networking:MAC地址导致
    实现ENSP模拟器与物理主机、虚拟机通信
    zabbix4.2配置监控华为路由器:基于ENSP模拟器
    Grafana展示zabbix监控数据
    zabbix4.2配置监控TCP连接状态
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12333306.html
Copyright © 2020-2023  润新知