Go 语言中 Map 是一种无序的键值对的集合。
Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
map声明
map 是引用类型,可以使用如下方式声明:
var mapName map[keyType]valueType
- mapName 为 map 的变量名。
- keyType 为键类型。
- valueType 是键对应的值类型。
var m1 = map[int]string
fmt.Println(m1,m1==nil) // map[] true
仅声明不进行初始化,该变量的值被编译器初始化为nil。
map初始化
- 声明的同时进行初始化
m1 := map[int]string{}
fmt.Println(m1,m1==nil) // map[] false
- 使用make()函数创建
m1 := make(map[int]string)
fmt.Println(m1,m1==nil) // map[] false
m2 := make(map[int]string,10) // 10 为 map 的容量
fmt.Println(m2) // map[]
当 map 增长到容量上限的时候,如果再增加新的 key-value,map 的大小会自动加 1,所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。
对于map而言,可以使用len()函数,但不能使用cap()函数。
map遍历
map 的遍历过程使用 for range 循环完成,代码如下:
m1 := map[int]string{1:"A",2"B",3:"C"}
for key,value := range m1{
fmt.Println(key,value)
}
- 如果只遍历值,可采用
for _,v := range m1,将不需要的键使用_改为匿名变量形式。 - 如果只遍历键,可采用
for k := range m1,无须将值改为匿名变量形式,忽略值即可。
Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。
map查找
假如我们有这么一种需求,想要知道 map 的某一个 key 是否存在。通过 map 的 key 可以获取两个值,第一个是该 key 对应的value值,第二个则是返回一个布尔值,true表示该键存在,false表示该键不存在。
m1 := map[int]string{1:"A",2"B",3:"C"}
v1,h1 := m1[1]
fmt.Println(v1,h1) // A true
v4,h4 := m1[4]
fmt.Println(v4,h4) // false
如果key存在,第一个返回值返回value的值。第二个返回值为 true。
如果key不存在,第一个返回值为空,第二个返回值为false。
map删除
使用delete()函数,指定key值可以方便的删除 map 中的k-v映射。
delete()函数接受两个参数,第一个是要操作的map,第二个是要删除的键。
delete()函数删除不存在的键也是可以的,只是不其任何作用而已。
m1 := map[int]string{1:"A",2"B",3:"C"}
delete(m1,1)
go 语言中未提供 map 清空的方法。如果想要清空可以遍历 map 然后一个一个的进行删除,还可以重新 make 一个新的 map。