Map类型又可以称之为字典类型,是一种无需的基于key:value的数据结构
定义语法如下
示范
| var m map[string]int |
| fmt.Println(m) |
| fmt.Println(m==nil) |
因为Map与切片类型一样都是引用类型,所以零值为nil,所以无法完成下述赋值
·需要我们用make函数为其申请好内存空间
| make(map[KeyType]ValueType) |
| |
| |
| var m = make(map[string]int) |
| fmt.Println(m) |
| fmt.Println(m==nil) |
| m["k1"]=111 |
| fmt.Println(m) |
我们也可以用map字面值的语法创建map,同时还可以指定一些最初的key/value:
| scoreMap:=map[string]int{ |
| "egon":99, |
| "铁蛋":100, |
| "铜蛋":88, |
| } |
| |
| scoreMap := make(map[string]int) |
| scoreMap["egon"] = 99 |
| scoreMap["铁蛋"] = 100 |
| scoreMap["铜蛋"] = 88 |
| |
| fmt.Println(scoreMap["egon"]) |
我们可以创建一个空的map:表达式是map[string]int{}
| var scoreMap = map[string]int{} |
| fmt.Println(scoreMap == nil) |
| scoreMap["egon"] = 99 |
| fmt.Println(scoreMap["egon"]) |
| var m = make(map[string]string) |
| |
| m["name"]="egon" |
| m["age"]="18" |
| m["gender"]="male" |
| fmt.Println(m) |
| |
| |
| delete(m,"gender") |
| fmt.Println(m) |
| delete(m,"kkk") |
| |
| |
| m["name"]="Egon" |
| fmt.Println(m) |
| |
| |
| fmt.Println(m["name"]) |
| fmt.Println(m["gender"]) |
| |
| |
| var ages = make(map[string]int) |
| ages["egon"] += 1 |
| fmt.Println(ages) |
| |
| 或者 |
| ages["egon"]++ |
| fmt.Println(ages) |
针对操作m[key],当key不存在时,返回的是value对应类型的零值,而极有可能出现key存在,但该key对应的值与其零值是相等的,如下所示
| var ages = make(map[string]int) |
| ages["张三"]=0 |
| fmt.Println(ages["张三"]) |
| fmt.Println(ages["egon"]) |
所以我们无法通过m[key]取到的值作为判断依据来判定key是否存在,需要这么做
| age1,ok:=ages["张三"] |
| fmt.Println(age1,ok) |
| |
| age2,ok:=ages["egon"] |
| fmt.Println(age2,ok) |
| |
| if ok { |
| fmt.Println(age2) |
| } else { |
| fmt.Println("查无此人") |
| } |
Go语言中使用for range
遍历map
| var ages = make(map[string]int) |
| ages["egon"] = 18 |
| ages["张三"] = 19 |
| ages["李四"] = 20 |
| |
| |
| for k,v := range ages { |
| fmt.Println(k,v) |
| } |
| |
| |
| for k,_ := range ages { |
| fmt.Println(k,v) |
| } |
| |
| for k := range ages { |
| fmt.Println(k) |
| } |
| |
| |
| for _,v := range ages { |
| fmt.Println(v) |
| } |
遍历map时的元素顺序与添加键值对的顺序无关,若想按照指定顺序遍map,需要将map中的key存入切片,然后对切片进行排序后,依据切片中排序好的key依次取map中的value
| var ages = make(map[string]int) |
| ages["egon"] = 18 |
| ages["张三"] = 19 |
| ages["李四"] = 20 |
| ages["王五"] = 21 |
| ages["牛佰"] = 22 |
| |
| |
| for k, v := range ages { |
| fmt.Println(k, v) |
| } |
| |
| |
| var keys []string |
| |
| for k := range ages { |
| keys = append(keys, k) |
| } |
| sort.Strings(keys) |
| |
| for _, k := range keys { |
| fmt.Printf("%s\t%d\n", k, ages[k]) |
| } |
| |
| |
| 因为我们一开始就知道keys的最终大小,因此给切片keys分配一个合适的大小将会更有效,如下所示 |
| keys := make([]string, 0, len(ages)) |
当新增元素时,map也会随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效,了解即可。但是有一点需要注意的是go语言设计规定我们可以对切片中的元素取地址,但是我们无法对map中的元素取地址