美文网首页
8.Go语言Map key-value数据结构

8.Go语言Map key-value数据结构

作者: 一枼落知天下 | 来源:发表于2019-06-01 13:56 被阅读0次

    main.go

    // Go语言Map
    package main
    
    //  包的本质是创建不同的文件夹
    //  go的每一个文件都是属于一个包的
    //  go以包的形式管理项目和文件目录。
    //  import "包的路径"
    import (
         utils "day18/model/utils" 
        _"fmt"
    )
    
    var content string = `
    ————————————————Go语言Map————————————————————
    一、map
    
    `
    
    
    func main() {
        utils.Entry()
    }
    
    

    utils.go

    // Go语言Map
    package utils
    
    import (
        "fmt"
        "sort"
    )
    
    var layout string = "2006-01-02"
    
    // 全局变量
    var Author string = "Jhou Shuai"
    
    // 全局变量
    var Description string = "Go语言Map"
    
    //全局变量:使用反引号来定义多行字符串
    var Content string = `
    ————————————————Go语言Map————————————————————
    一、map
        1.map是key-value数据结构,称为字段或关联数组
        var 变量名 map[keytype]valuetype
        key的数据类型:
            bool、数字、string、指针、channel
            通常:int、string
        value的数据类型:
             bool、数字、string、指针、channel、map
            通常:int float string struct map
        var a map[string]string
        var a map[string]int
        var a map[int]string
        var a map[string]map[int]string
        map声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
    `
    
    type Stu struct {
        Name string
        Age int
        Address string
    }
    
    
    /**
     * [Init 入口]
     * @author Jhou Shuai
     * @datetime 2019-05-18T11:58:33+0800
     */
    func Entry() {
        userApplication()
    }
    
    /**
     * [mapInit map基本介绍]
     * @author Jhou Shuai
     * @datetime 2019-06-01T11:11:03+0800
     */
    func mapInit() {
        // 1.使用map前,先make,make的作用是给map分配数据空间
        // 2.Key不能重复,若重复咯。则以最后的一个为准
        // 3.value可以重复
        // 4.key-value无序的
        var student map[int]map[string]string
        student = make(map[int]map[string]string, 2)
    
        var info map[string]string
        info = make(map[string]string, 10)
        info["name"] = "周帅"
        info["age"] = "18"
        info["age"] = "22"
        student[0] = info
        fmt.Println(student)
    }
    
    /**
     * [mapUseMethod map的使用方式]
     * @author Jhou Shuai
     * @datetime 2019-06-01T11:10:46+0800
     */
    func mapUseMethod() {
        // 1.第一种使用方式:
        var school map[int]map[string]string
        school = make(map[int]map[string]string, 2)
    
        // 2.第二种使用方式:
        teacher := make(map[string]string)
        teacher["No01"] = "张导"
        teacher["No02"] = "李师师"
    
        // 3.第三种使用方式:
        // var student map[string]string = map[string]string{"No001":"Faker","No002":"Uzi"}
        // var student = map[string]string{"No001":"Faker","No002":"Uzi"}
        // student := map[string]string{"No001":"Faker","No002":"Uzi"}
        student := make(map[string]map[string]string)
        student["No001"] = make(map[string]string, 3)
        student["No001"]["name"] = "Faker"
        student["No001"]["sex"] = "男"
        student["No001"]["address"] = "玉林北巷988号"
    
        student["No002"] = make(map[string]string, 3)
        student["No002"]["name"] = "Uzi"
        student["No002"]["sex"] = "男"
        student["No002"]["address"] = "春熙路998号"
    
        school[0] = teacher
        // map[0:map[No01:张导 No02:李师师]]
        fmt.Println(school)
        // map[No001:map[address:玉林北巷988号 name:Faker sex:男] No002:map[address:春熙路998号 name:Uzi sex:男]]
        // map[address:春熙路998号 name:Uzi sex:男]
        fmt.Println(student["No002"])
    }
    
    /**
     * [curdMap map的增删改查]
     * @author Jhou Shuai
     * @datetime 2019-06-01T11:10:33+0800
     */
    func curdMap() {
        var cities = make(map[string]string)
        // 增加
        cities["No01"] = "上海"
        cities["No02"] = "北京"
        cities["No03"] = "成都"
        cities["No04"] = "重庆"
        fmt.Println(cities)
    
        // 修改
        cities["No03"] = "天府之国"
        // 删除
        // delete 内置函数
        // 删除所有,遍历逐一删除
        // 直接make 一个新的空间 一次性清空
        // cities = make(map[string]string) 一次性清空
        delete(cities, "No04")
        delete(cities, "No05")
        fmt.Println(cities)
    
        // 查找
        val, ok := cities["No05"]
        if ok {
            fmt.Println(val)
        } else {
            fmt.Println("key值不存在!")
        }
    }
    
    /**
     * [mapForRange map遍历 for-range]
     * @author Jhou Shuai
     * @datetime 2019-06-01T11:13:16+0800
     */
    func mapForRange() {
        var cities = make(map[string]string)
        cities["No01"] = "上海"
        cities["No02"] = "北京"
        cities["No03"] = "成都"
        cities["No04"] = "重庆"
    
        for key, val := range cities {
            fmt.Printf("编号:%v,城市名:%v \n", key, val)
        }
    
        fmt.Println("----------华丽的分割线-----------")
        student := make(map[string]map[string]string)
        student["No001"] = make(map[string]string, 3)
        student["No001"]["name"] = "Faker"
        student["No001"]["sex"] = "男"
        student["No001"]["address"] = "玉林北巷988号"
    
        student["No002"] = make(map[string]string, 3)
        student["No002"]["name"] = "Uzi"
        student["No002"]["sex"] = "男"
        student["No002"]["address"] = "春熙路998号"
    
        kyName := make(map[string]string, 3)
        kyName["name"] = "姓名"
        kyName["sex"] = "性别"
        kyName["address"] = "地址"
    
    
        fmt.Println("总共有:",len(student),"个学生!信息如下:")
        for key, items := range student {
            fmt.Printf("学生编号:%v \t", key)
            for ky, val := range items {
                alias, _ := kyName[ky]
                fmt.Printf("%v:%v \t", alias, val)
            }
            fmt.Println()
        }
    }
    
    
    /**
     * [mapSlice map切片]
     * @author Jhou Shuai
     * @datetime 2019-06-01T12:24:43+0800
     */
    func mapSlice() {
        
        // var monster []map[string]string = make([]map[string]string,2)
        monster  := make([]map[string]string,2)
    
        if monster[0]  == nil {
            monster[0] = make(map[string]string,2)
            monster[0]["name"]  = "饕餮"
            monster[0]["power"] = "10000"
        }
    
        if monster[1]  == nil {
            monster[1] = make(map[string]string,2)
            monster[1]["name"]  = "地狱犬"
            monster[1]["power"] = "20000"
        }
    
        // panic: runtime error: index out of range
        // 越界咯
        // if monster[2]  == nil {
        //     monster[2] = make(map[string]string,2)
        //     monster[2]["name"]  = "凤凰"
        //     monster[2]["power"] = "30000"
        // }
    
        // 通过切片的append函数,可以动态的增加
        newMonster := map[string]string{
            "name":"青龙",
            "power":"100000",
        }
    
        monster = append(monster,newMonster)
    
        fmt.Println(monster)
    }
    
    
    /**
     * [mapSorted map排序]
     * @author Jhou Shuai
     * @datetime 2019-06-01T13:01:15+0800
     */
    func mapSorted() {
        // 1.现将map的key放入到切片中
        // 2.对切片进行排序 sort.Ints()
        // 3.遍历切片,然后按照key来输出map的值
        
        var intMap map[int]int = make(map[int]int,5)
        intMap[1] = 30
        intMap[0] = 300
        intMap[3] = 20
        intMap[4] = 50
        intMap[2] = 80
    
        var keys []int
        for key,_ := range intMap {
            keys = append(keys,key)
        }
    
        sort.Ints(keys)
    
        for _,val :=range keys {
            fmt.Printf("intMap[%v]=%v \n",val,intMap[val])
        }
    }
    
    
    
    func modify(mapArg map[int]int) {
        mapArg[10] = 300
    }
    
    
    /**
     * [mapUsedDetail 使用细节]
     * @author Jhou Shuai
     * @datetime 2019-06-01T13:10:17+0800
     */
    func mapUsedDetail() {
        // 1.map是引用类型:遵守引用类型传递的机制,在一个函数接收map,
        // 修改后,会直接修改原来的map
        // 2.map动态扩容,自动扩容,动态的增加key-value。切片slice只能通过append
        // 3.map的value经常使用struct类型,更适合管理更复杂的数据
        mapArg := make(map[int]int,2)
        mapArg[1] = 30
        mapArg[2] = 20
        mapArg[10] = 100
        fmt.Println(mapArg)
        modify(mapArg)
        fmt.Println(mapArg)
    
        var students map[string]Stu = make(map[string]Stu,2)
        stu01 := Stu{"Faker",19,"玉林北巷988号"}
        stu02 := Stu{"Uzi",18,"春熙路998号"}
    
        students["No001"] = stu01
        students["No002"] = stu02
    
        // 遍历
        fmt.Println("总共有:",len(students),"个学生!信息如下:")
        for key, items := range students {
            fmt.Printf("学生编号:%v\t 姓名:%v\t 年龄:%v\t 地址:%v\t \n", 
                key,items.Name,items.Age,items.Address)
        }
    }
    
    
    
    func userApplication() {
        users := make(map[string]map[string]string,10)
        users["Uzi"] = make(map[string]string,2)
        users["Uzi"]["nickname"] = "狂小狗"
        users["Uzi"]["pwd"]  = "123456"
        modifyUser(users,"Faker","蜗壳")
        modifyUser(users,"Uzi","洗澡啦")
        fmt.Println(users)
    }
    
    
    func modifyUser(users map[string]map[string]string, name string,nickname string) {
        // 判断users中是否有name
        // val,ok := users[name]
        if users[name] != nil {
            users[name]["pwd"] = "888888"
            users[name]["nickname"] = nickname
        }else{
            users[name] = make(map[string]string,2)
            users[name]["nickname"] = nickname
            users[name]["pwd"]  = "123456"
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:8.Go语言Map key-value数据结构

          本文链接:https://www.haomeiwen.com/subject/ibzotctx.html