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) }
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) }
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"]) }
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() } }
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) }
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]) } }
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() } }
作者:华王
博客:https://www.cnblogs.com/huahuawang/
浙公网安备 33010602011771号