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)
}

原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12333306.html