1. 简介
map 类似于Java中的 map,是一种存储键值对的数据结构。
map 属于引用类型;
声明方式:var map1 map [keyType] valueType,
示例:
// 声明及初始化 var map1 = make(map[int]int) map1[1] = 12
// 声明 map var map2 map[string] int // 初始化 map map2 = make(map[string]int) map2["1"] = 123 fmt.Println(map1)
未初始化的map值为 nil,声明时不需要指定map的容量,map是可以动态增长,当 map 增长到容量上限时,map 的大小自动增加,最好在初始化时设置其容量的大小;
keyType:
1. 任意可以用 == 或者 != 操作符比较的类型;
2. 只包含内建类型的 struct ;
3. 指针和接口类型;
4. 提供 Ke() 和 Hash() 方法的结构体,这样可以通过结构体的域计算出唯一的数字或者字符串的 key;
5. 数组、切片和含有数组和切片的结构体不能作为 key;
valueType:
1. 任意类型,可以通过空接口类型存储任意值;
2. 函数类型,通过key选择要执行的函数
2. 基本操作
2.1 添加元素
map1[key] = value
var a3 = make(map[int]int,5) a3[1]=1
2.2 获取元素
value = map1[key]
var a3 = make(map[int]int,5) a3[1]=1 valuea31 := a3[1]
2.3 判断 key 是否存在
value1,isExist = map1[key1],value1 key1对应的值,isExist,bool值,表示是否存在这个 key1
// 验证 val1, isPresent = map1[key1] 形式判断 val1 到底是空值,还是不存在这个 key1 var a5 = make(map[int]int) a5[1] = 0 value3,isExist3 := a5[1] fmt.Printf("a5[1] value=%v,isExist=%t ",value3,isExist3) value4,isExist4 := a5[2] fmt.Printf("a5[2] value=%v,isExist=%t ",value4,isExist4) // 简写形式,判断 key 是否存在,并操作 value if value6,isExist6 := a5[1];isExist6{ fmt.Printf("value6 exist:%v, value:%v",isExist6,value6) } // 只判断 key 是否存在 if _,isExist6 := a5[1];isExist6{ fmt.Printf("value6 exist:%v",isExist6) }
2.4 删除元素
delete(map1,key1)
var a5 = make(map[int]int) a5[1] = 0 // 删除元素,不存在也不报错 delete(a5,1) delete(a5,123)
2.5 for-range
var map1 = make(map[int]int) map1[1] = 12 map1[2] = 13 map1[12] = 2 for key, value := range map1 { fmt.Printf("map1 key=%v,value=%v ",key,value) }
2.6 排序
先将 key 存放到 slice ,再对 slice 进行排序, 然后按照 排序的 slice 输出 map
// map1 初始化 var map1 = make(map[int]int) map1[1] = 12 map1[2] = 13 map1[12] = 2 // 存储 map1 的 key var slice = make([]int,3) i:= 0 for key := range map1 { slice[i]=key i++ } // 对 key 进行排序 sort.Ints(slice) // 输出排序后的 map1 for _, value := range slice { fmt.Println(value,"=",map1[value]) }