简介
map是一种哈希表的引用,map类型可以缩写成map[k]v;
不要拿浮点型当key
map的元素不是一个变量,禁止对map的元素取地址:&m["a"]
这是错误的会提示compile error: cannot take address of map element
len()函数可以回去map的元素个数
range可以对map进行遍历,但是遍历的结果的顺序是不确定的。
使用
- 使用make函数创建
m:=make(map[string]int)
- 字面量创建map
m:=map[string]int{}
- map和nil的关系
值为nil的map是不能操作元素的,否则会panic,所以建议使用make()函数创建map。
var m1 = map[string]int{}
var m2 map[string]int
var m3=make(map[string]int)
fmt.Println("m1==nil:",m1==nil)//m1==nil: false
fmt.Println("m2==nil:",m2==nil)//m2==nil: true
fmt.Println("m3==nil:",m3==nil)//m3==nil: false
- 使用元素
m["a"]=1
- 删除元素:
delete(m,"a")
- 获取不存在的key
- 获取不存在的key不会报错,会返回对应value类型的零值。
package main
import (
"fmt"
)
func main() {
m1:=make(map[string]int)
fmt.Println(m1["a"])//0
m2:=make(map[int]bool)
fmt.Println(m2[1])//false
}
- 如何判断是元素的值是零值,而不是因为不存在key返回的零值。
其实提供一种ok布尔值来判断是否存在该元素。ok是布尔值,true代表元素存在,false代表元素不存在。
ig value,ok:=m["aaa"];ok{
fmt.Println("key aaa存在")
}
- 如何顺序遍历map
顺序遍历map的方法是,先把所有的key收集起来,组成一个slice,然后按照你想要的规则排序key,然后遍历key的slice去获取value。
package main
import (
"fmt"
"sort"
)
func main() {
var m = map[string]int{"a":111,"c":333,"e":555,"d":444,"b":222}
for k,v:=range m{
fmt.Println(k,"=>",v)
}
fmt.Println("------------")
var keys []string
for key:=range m{
keys=append(keys,key)
}
sort.Strings(keys)
for _,k:=range keys{
fmt.Println(k,"=>",m[k])
}
}
=>打印结果
e => 555
d => 444
b => 222
a => 111
c => 333
------------
a => 111
b => 222
c => 333
d => 444
e => 555