map是key-value数据结构,又称为字段或者关联数组.类似于其它编程语言的集合,在编程中进程使用
var map变量名 map[keytype]valuetype
keytype可以是什么类型?
go中的map的key可以是多种类型:bool,数字(整数,浮点数),string,指针,channel,还可以是只包含前面几种类型的接口,结构体,数组
key的类型通常为int,string
注意: slice,map还有function不可以作为key,因为这几个没法用 == 来判断
keytype可以是什么类型?
valuetype的类型和key基本一样,通常为数字(整数,浮点数),string,map,struct
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
注意: 声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
- func main() {
- //map的声明和注意事项
- var a map[string]string
- //当声明map后,直接输出,结果:map[]
- fmt.Println(a) //map[]
- //如果直接给map赋值,会报错:panic: assignment to entry in nil map(没有给map分配数据空间)
- // a["name"] = "张三"
- //在使用map前,需要先make,make的作用是给map分配数据空间
- a = make(map[string]string, 10)
- a["name"] = "张三"
- a["name1"] = "张三1"
- a["name"] = "李四"
- fmt.Println(a)
- }
1.map在使用前一定要make
2.map的key是不能重复的,如果重复了,则以最后这个key-value为准
3.map的value可以是相同的
4.map的key-value是无序的
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- //第一种使用方式
- var a map[string]string
- //在使用map前,需要先make,make的作用是给map分配数据空间
- a = make(map[string]string, 10)
- a["name"] = "张三"
- a["name1"] = "张三1"
- a["name"] = "李四"
- fmt.Println(a)
-
- //推荐使用:第二种使用方式
- cities := make(map[string]string)
- cities["c1"] = "北京"
- cities["c2"] = "上海"
- cities["c3"] = "广州"
- fmt.Println(cities)
-
- //第三种使用方式
- var heros map[string]string = map[string]string{
- "h1":"张三",
- "h2":"李四", //最后一个逗号不能少
- }
- // heros := map[string]string {
- // "h1":"张三",
- // "h2":"李四",
- // }
- heros["h3"] = "王五"
- fmt.Println(heros)
- }
- /**
- * 案例: 演示一个key-value:
- * 存放三个学生消息,每个学生有姓名,性别
- * 思路: map[string]map[string]string
- */
- students := make(map[string]map[string]string)
- students["0001"] = make(map[string]string, 2)
- students["0001"]["name"] = "张三"
- students["0001"]["sex"] = "男"
- students["0002"] = make(map[string]string, 2)
- students["0002"]["name"] = "赵敏"
- students["0002"]["sex"] = "女"
- fmt.Println(students)
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- //增加,修改
- cities := make(map[string]string)
- cities["c1"] = "北京"
- cities["c2"] = "上海"
- cities["c3"] = "广州"
- fmt.Println(cities)
- //因为c1这个key已经存在,故下面的是修改
- cities["c1"] = "重庆"
- fmt.Println(cities)
-
- //删除
- delete(cities, "c1")
- fmt.Println(cities)
- //当delete指定的key不存在时,删除不会操作,也不会报错
- delete(cities, "c4")
- fmt.Println(cities)
- }
map删除
说明:
delete(map,key),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,就不操作,但也不报错
细节说明
如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除或者map = make(...),make一个新的,让原来的成为垃圾,被GC回收
- //如果希望一次性删除所有的key
- //1.变遍历所有的key,再足个删除
- //2.直接make一个新的空间
- cities := make(map[string]string)
- fmt.Println(cities)
- //演示map的查找
- val, ok := cities["c1"]
- if ok {
- fmt.Printf("存在c1这个key,值为%v\n", val)
- } else {
- fmt.Println("不存在c1这个key")
- }
案例演示一个相对复杂的map遍历,该map的value又是一个map
说明:map的遍历使用for-range的结构遍历
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- //使用for-range遍历
- var a map[string]string
- a = make(map[string]string)
- a["name"] = "张三"
- a["name1"] = "张三1"
- a["name"] = "李四"
- fmt.Println(a)
- for k, v := range a {
- fmt.Printf("k=%v,v=%v\n",k, v)
- }
-
- //使用for-range遍历比较复杂的map
- /**
- * 案例: 演示一个key-value:
- * 存放三个学生消息,每个学生有姓名,性别
- * 思路: map[string]map[string]string
- */
- students := make(map[string]map[string]string)
- students["0001"] = make(map[string]string, 2)
- students["0001"]["name"] = "张三"
- students["0001"]["sex"] = "男"
- students["0002"] = make(map[string]string, 2)
- students["0002"]["name"] = "赵敏"
- students["0002"]["sex"] = "女"
- fmt.Println(students)
- fmt.Println()
- for key, val := range students {
- fmt.Printf("key=%v\n", key)
- for k, v := range val {
- fmt.Printf("\t k=%v, v=%v\n", k,v)
- }
- }
- }
- //统计map长度
- a := make(map[int]int,2)
- a[1] = 1
- a[2] = 2
- fmt.Println("a中有", len(a), "对key-value")