Go_map
Posted yzg-14
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go_map相关的知识,希望对你有一定的参考价值。
1. map
语法:
package main import ( "fmt" ) func main() { //map的声明和注意事项 var a map[string]string //在使用map前,需要先make , make的作用就是给map分配数据空间 //map声明之后还没有分配空间 a = make(map[string]string, 10) a["no1"] = "宋江" a["no2"] = "吴用" a["no1"] = "武松" a["no3"] = "吴用" fmt.Println(a) //map[no1:武松 no2:吴用 no3:吴用] }
2. map的使用
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) //第二种方式(make) cities := make(map[string]string) cities["no1"] = "北京" cities["no2"] = "天津" cities["no3"] = "上海" fmt.Println(cities) //第三种方式(不写make直接赋值,底层有make) 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"]) }
3. map的增删改查
package main import ( "fmt" ) func main() { //1. 增加 cities := make(map[string]string) cities["no1"] = "北京" cities["no2"] = "天津" cities["no3"] = "上海" fmt.Println(cities) //2. 修改 //因为 no3这个key已经存在,因此下面的这句话就是修改 cities["no3"] = "上海~" fmt.Println(cities) //3. 删除 delete(cities, "no1") //python中使用del fmt.Println(cities) //当delete指定的key不存在时,删除不会操作,也不会报错 delete(cities, "no4") fmt.Println(cities) //4. 查询 val, ok := cities["no2"] if ok { fmt.Printf("有no1 key 值为%v ", val) } else { fmt.Printf("没有no1 key ") } //如果希望一次性删除所有的key //1. 遍历所有的key,如何逐一删除 [遍历] //2. 直接make一个新的空间 cities = make(map[string]string) fmt.Println(cities) }
4. map的遍历
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 ", k, v) } fmt.Println("cities 有", len(cities), " 对 key-value") //3 //使用for-range遍历一个结构比较复杂的map studentMap := make(map[string]map[string]string) //值是一个map,和Python中的字典的值是字典一样 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(" k2=%v v2=%v ", k2, v2) } fmt.Println() } }
5. 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" } fmt.Println(monsters) //[map[age:500 name:牛魔王] map[age:400 name:玉兔精]] // 下面这个写法越界,只能放两个妖怪 // 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) //[map[age:500 name:牛魔王] map[age:400 name:玉兔精] map[age:200 name:新的妖怪~火云邪神]] fmt.Println(len(monsters)) //3 }
6. 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) } //对key排序 sort.Ints(keys) fmt.Println(keys) //[1 4 8 10] //通过排序好的key去value for _, k := range keys{ fmt.Printf("map1[%v]=%v ", k, map1[k]) } }
7. map的使用细节
package main import ( "fmt" ) func modify(map1 map[int]int) { map1[10] = 900 } func main() { //1. 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[1:90 2:88 10:900 20:2] }
func main() { //1. map是引用类型,遵守引用类型传递的机制,在一个函数接收map //修改后,会直接修改原来的map map1 := make(map[int]int, 2) //这里是2,添加超过2对也不会报错 map1[1] = 90 map1[2] = 88 map1[10] = 1 map1[20] = 2 modify(map1) // 看看结果, map1[10] = 900 ,说明map是引用类型 fmt.Println(map1) //map[1:90 2:88 10:900 20:2] }
package main import ( "fmt" ) //定义一个学生结构体 type Stu struct { Name string Age int Address string } func main() { //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 ", k) fmt.Printf("学生的名字是%v ", v.Name) fmt.Printf("学生的年龄是%v ", v.Age) fmt.Printf("学生的地址是%v ", v.Address) fmt.Println() } }
以上是关于Go_map的主要内容,如果未能解决你的问题,请参考以下文章