Golang 【第九篇】MAP

Golang 【第九篇】MAP

1 map的基本介绍

 

 

package main
import (
    "fmt"
)

func main() {
    //map的声明和注意事项 
    var a map[string]string
    //在使用map前,需要先make , make的作用就是给map分配数据空间
    a = make(map[string]string, 10)
    a["no1"] = "宋江" //ok?
    a["no2"] = "吴用" //ok?
    a["no1"] = "武松" //ok?
    a["no3"] = "吴用" //ok?
    fmt.Println(a)
}
map的声明
package main
import (
    "fmt"
)

func main() {
    //第二种方式
    cities := make(map[string]string)
    cities["no1"] = "北京"
    cities["no2"] = "天津"
    cities["no3"] = "上海"
    fmt.Println(cities)

    //因为 no3这个key已经存在,因此下面的这句话就是修改
    cities["no3"] = "上海~" 
    fmt.Println(cities)

    //演示删除
    delete(cities, "no1")
    fmt.Println(cities)
    //当delete指定的key不存在时,删除不会操作,也不会报错
    delete(cities, "no4")
    fmt.Println(cities)


    //演示map的查找
    val, ok := cities["no2"]
    if ok {
        fmt.Printf("有no1 key 值为%v\n", val)
    } else {
        fmt.Printf("没有no1 key\n")
    }

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

}
mapcrud
package main
import (
    "fmt"
)

func main() {
    //第一种使用方式
    
    var a map[string]string
    //在使用map前,需要先make , make的作用就是给map分配数据空间
    a = make(map[string]string, 10)
    a["no1"] = "宋江" //ok?
    a["no2"] = "吴用" //ok?
    a["no1"] = "武松" //ok?
    a["no3"] = "吴用" //ok?
    fmt.Println(a)

    //第二种方式
    cities := make(map[string]string)
    cities["no1"] = "北京"
    cities["no2"] = "天津"
    cities["no3"] = "上海"
    fmt.Println(cities)

    //第三种方式
    heroes := map[string]string{
        "hero1" : "宋江",
        "hero2" : "卢俊义",
        "hero3" : "吴用",
    }
    heroes["hero4"] = "林冲"
    fmt.Println("heroes=", heroes)


    //案例
    /*
    课堂练习:演示一个key-value 的value是map的案例
    比如:我们要存放3个学生信息, 每个学生有 name和sex 信息
    思路:   map[string]map[string]string

    */
    studentMap := make(map[string]map[string]string)
    
    studentMap["stu01"] =  make(map[string]string, 3)
    studentMap["stu01"]["name"] = "tom"
    studentMap["stu01"]["sex"] = ""
    studentMap["stu01"]["address"] = "北京长安街~"

    studentMap["stu02"] =  make(map[string]string, 3) //这句话不能少!!
    studentMap["stu02"]["name"] = "mary"
    studentMap["stu02"]["sex"] = ""
    studentMap["stu02"]["address"] = "上海黄浦江~"

    fmt.Println(studentMap)
    fmt.Println(studentMap["stu02"])
}
mapuse
package main
import (
    "fmt"
)

func main() {
    //使用for-range遍历map
    //第二种方式
    cities := make(map[string]string)
    cities["no1"] = "北京"
    cities["no2"] = "天津"
    cities["no3"] = "上海"
    
    for k, v := range cities {
        fmt.Printf("k=%v v=%v\n", k, v)
    }

    fmt.Println("cities 有", len(cities), " 对 key-value")

    //使用for-range遍历一个结构比较复杂的map
    studentMap := make(map[string]map[string]string)
    
    studentMap["stu01"] =  make(map[string]string, 3)
    studentMap["stu01"]["name"] = "tom"
    studentMap["stu01"]["sex"] = ""
    studentMap["stu01"]["address"] = "北京长安街~"

    studentMap["stu02"] =  make(map[string]string, 3) //这句话不能少!!
    studentMap["stu02"]["name"] = "mary"
    studentMap["stu02"]["sex"] = ""
    studentMap["stu02"]["address"] = "上海黄浦江~"

    for k1, v1 := range studentMap {
        fmt.Println("k1=", k1)
        for k2, v2 := range v1 {
                fmt.Printf("\t k2=%v v2=%v\n", k2, v2)
        }
        fmt.Println()
    }
}
map的遍历

 

2 map的切片

package main
import (
    "fmt"
)

func main() {
    //演示map切片的使用
    /*
    要求:使用一个map来记录monster的信息 name 和 age, 也就是说一个
    monster对应一个map,并且妖怪的个数可以动态的增加=>map切片
    */
    //1. 声明一个map切片
    var monsters []map[string]string
    monsters = make([]map[string]string, 2) //准备放入两个妖怪
    //2. 增加第一个妖怪的信息
    if monsters[0] == nil {
        monsters[0] = make(map[string]string, 2)
        monsters[0]["name"] = "牛魔王"
        monsters[0]["age"] = "500"
    }

    if monsters[1] == nil {
        monsters[1] = make(map[string]string, 2)
        monsters[1]["name"] = "玉兔精"
        monsters[1]["age"] = "400"
    }

    // 下面这个写法越界。
    // if monsters[2] == nil {
    //     monsters[2] = make(map[string]string, 2)
    //     monsters[2]["name"] = "狐狸精"
    //     monsters[2]["age"] = "300"
    // }

    //这里我们需要使用到切片的append函数,可以动态的增加monster
    //1. 先定义个monster信息
    newMonster := map[string]string{
        "name" : "新的妖怪~火云邪神",
        "age" : "200",
    }
    monsters = append(monsters, newMonster)

    fmt.Println(monsters)
}
mapslice

 

3 map排序

package main
import (
    "fmt"
    "sort"
)

func main() {

    //map的排序
    map1 := make(map[int]int, 10)
    map1[10] = 100
    map1[1] = 13
    map1[4] = 56
    map1[8] = 90

    fmt.Println(map1)

    //如果按照map的key的顺序进行排序输出
    //1. 先将map的key 放入到 切片中
    //2. 对切片排序 
    //3. 遍历切片,然后按照key来输出map的值

    var keys []int
    for k, _ := range map1 {
        keys = append(keys, k)
    }
    //排序
    sort.Ints(keys)
    fmt.Println(keys)

    for _, k := range keys{
        fmt.Printf("map1[%v]=%v \n", k, map1[k])
    }
    
}
mapsort

 

4 mapdetails

package main
import (
    "fmt"
)
func modify(map1 map[int]int) {
    map1[10] = 900
}

//定义一个学生结构体
type Stu struct {
    Name string
    Age int
    Address string
}

func main() {

    //map是引用类型,遵守引用类型传递的机制,在一个函数接收map,
    //修改后,会直接修改原来的map

    map1 := make(map[int]int, 2)
    map1[1] = 90
    map1[2] = 88
    map1[10] = 1
    map1[20] = 2
    modify(map1)
    // 看看结果, map1[10] = 900 ,说明map是引用类型
    fmt.Println(map1) 


    //map的value 也经常使用struct 类型,
    //更适合管理复杂的数据(比前面value是一个map更好),
    //比如value为 Student结构体 【案例演示,因为还没有学结构体,体验一下即可】
    //1.map 的 key 为 学生的学号,是唯一的
    //2.map 的 value为结构体,包含学生的 名字,年龄, 地址

    students := make(map[string]Stu, 10)
    //创建2个学生
    stu1 := Stu{"tom", 18, "北京"}
    stu2 := Stu{"mary", 28, "上海"}
    students["no1"] = stu1
    students["no2"] = stu2

    fmt.Println(students)

    //遍历各个学生信息
    for k, v := range students {
        fmt.Printf("学生的编号是%v \n", k)
        fmt.Printf("学生的名字是%v \n", v.Name)
        fmt.Printf("学生的年龄是%v \n", v.Age)
        fmt.Printf("学生的地址是%v \n", v.Address)
        fmt.Println()
    }

}
map struct

 

posted @ 2021-08-14 22:00  风hua  阅读(41)  评论(0)    收藏  举报