map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value。
var map1 map[keytype]valuetype
未初始化的 map 的值是 nil。
map 传递给函数的代价很小:在 32 位机器上占 4 个字节,64 位机器上占 8 个字节,无论实际上存储了多少数据。通过 key 在 map 中寻找值是很快的,比线性查找快得多,但是仍然比从数组和切片的索引中直接读取要慢 100 倍;所以如果你很在乎性能的话还是建议用切片来解决问题。
map 也可以用函数作为自己的值,这样就可以用来做分支结构(详见第 5 章):key 用来选择要执行的函数。
如果 key1 是 map1 的key,那么 map1[key1]
就是对应 key1 的值。
key1 对应的值可以通过赋值符号来设置为 val1:map1[key1] = val1
。
命令 v := map1[key1]
可以将 key1 对应的值赋值为 v;如果 map 中没有 key1 存在,那么 v 将被赋值为 map1 的值类型的空值。
常用的 len(map1)
方法可以获得 map 中的 pair 数目,这个数目是可以伸缩的,因为 map-pairs 在运行时可以动态添加和删除。
make 创建map
map 是 引用类型 的: 用 make 方法来分配内存。
map 的初始化:var map1 = make(map[keytype]valuetype)
。
或者简写为:map1 := make(map[keytype]valuetype)
。
map 容量
map 可以根据新增的 key-value 对动态的伸缩,因此它不存在固定长度或者最大限制。但是你也可以选择标明 map 的初始容量 capacity
,就像这样:make(map[keytype]valuetype, cap)
。
map2 := make(map[string]float32, 100)
当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。
验证键值对是否存
val1, isPresent = map1[key1]
isPresent 返回一个 bool 值:如果 key1 存在于 map1,val1 就是 key1 对应的 value 值,并且 isPresent为true;如果 key1 不存在,val1 就是一个空值,并且 isPresent 会返回 false。
删除键值对
delete(map1, key1)
for-range
for key, value := range map1 {
...
}
第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值。
如果只想获取 key,你可以这么使用:
for key := range map1 {
fmt.Printf("key is: %d\n", key)
}