跳转至

11.map类型

go语言提供了一种称为map的数据类型,如果你熟悉Python,这个map类型与Python中的dict相似。

map类型就是一种键值对哈希表,其键和值几乎可以是任何类型。具有查找快速、方便的特点。

声明

a := map[<keyType>]<valueType>{
    key1: value1,
    key2: value2,
    ...
}

Note

显然,Go语言中的map类型,需要指定keyvalue的类型,也不能在一个map中混用多个类型。

查找与赋值

查找

value = a[key]

赋值

a[newKey] = newValue

Note

这里的新键可以是存在的,即覆盖;也可以是新的,也就是新创建一个键值对。

同时,对于上述的查找语句,如果查找的键不存在,Go语言不会报错,而是返回值类型的零值。

更好的查找语句

value, exist := maps[key]
从上面的代码不难看出,其实查找语句返回了两个值,一个是对于键的值,当然,如果键不存在,就返回零值;另一个是键是否存在于map的bool值,如果存在,就返回true,否则返回false。可以用这样的语句在查询时判断map中是否存在某个键。

map传入函数

map其实是一个指针,在传入函数或者复制的时候,修改其拷贝或者函数内参数,都会影响原变量。

删除键值对

delete(mapVar, key)
上述代码将删除名为mapVar的map中的键为key的键值对。

使用make对map进行预分配空间

除非在初始化时用字面值初始化了map,否则需要使用make对map类型变量预分配空间。

make(map[<keyType>]<valueType>), <length>)
上述代码分配了一个指定长度大小的空间。

Note

也许你注意到了,既然初始化可以指定长度,那么是不是也可以用len()获得map变量的长度能?

答: 是的 ,且使用make初始化时,不论预分配多少长度或空间,使用len获取的map变量的长度为0

range变量map

range 变量的map也有两个值,一个是key,另一个是value。

for key, value := range myMap{
    <statement>
}