8.Go Language Map key-value data structure

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

}

Reproduced in: https: //www.jianshu.com/p/889b0c0184b9

Guess you like

Origin blog.csdn.net/weixin_33725270/article/details/91334983