目录
一. 概念
map 是一种特殊的数据结构: 一种键值对的无序集合, 可以根据给定的 key 快速的定位对应的value.
在 Go 语言中 map 是一种内建的引用类型
二. 声明和初始化
1. 声明方式
声明方式如下: 声明的时候不需要知道 map 的长度, 因为 map 可以动态增长
//var mapname map[keytype]valuetype
var map1 map[string]int64
2. 初始化
未初始化的 map 的值是 nil , 不可以直接使用.
map 是引用类型的: 内存分配使用 make() 方法, 不能使用 new() 来构造map
// map 的初始化
var map1 = make(map[keytype]valuetype)
map1 := make(map[keytype]valuetype)
// 这样子也是可以的
map1 := map[int]string{1:"string", 2:"hello"}
三. 使用方法
1. 测试key是否存在
//如果key存在, ok 为 true, value为对应的值, 否则 ok 为 false
value, ok := map1[key]
//只是判断 key 是否存在
if _, ok := map1[key]; ok {
//todo
}
2. 删除元素
//从 map1 中删除 key, 如果不存在不会报错
delete(map1, key)
3. for-range
k, v 分别代表 map 中的一对 pair 的键/值, 都是 for 循环内的局部变量
注意: map 是无序的, 没有按照 key 或者 value 来排序
for k, v := range map1 {
//todo
}
4. map 的排序
如果想要为 map 排序 (key 或者 value), map本身是做不到的, 所以要借助其他方式.
将 key/value 拷贝到一个切片, 再对切片进行排序 (使用 sort 包, 见上一篇 18. 数组和切片), 然后再用 for-range 遍历切片, 配合map得到一组有序的数据.
5. 将 map 的 key, value 互换
如果 value 值可以作为 key 并且是唯一的, 我们可以很方便的做到键值互换
map1 := make(map[int]string)
// init map1
invMap := make(map[string]int)
for k, v := range map1 {
invMap[v] = k
}
四. 使用注意
1. map 可以动态调整大小, 没有固定长度或者最大限制. 但是可以标明初始容量 make(map[keytype]valuetype, cap)
2. key 可以是任何可以用 == 或者 != 操作符比较的类型, 比如 string, int, float. 数组, 切片不能作为key, 当使用结构体作为 key 的时候, 结构体内的元素必须全部是可以用 == 或者 != 操作符比较的类型
3. value 可以是任意类型; 我们可以通过使用空接口类型, 存储任何类型的值, 使用这种类型作为值时需要先做一次类型断言
4. map 也可以用函数作为自己的值, 这样就可以用来做分支结构, 用 key 来选择要执行的函数
5. 可以使用 len(map) 来获得 map 中的 pair 数量.