map

map是Go语言中提供的映射关系的容器类数据结构,其内部使用散列表(hash)实现。

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

构建map

var

1
var m map[KeyType]ValueType

make()

1
m := make(map[KeyType]ValueType,[cap])

cap为可选参数

使用字面值

map支持在声明的时候填充元素

1
2
3
4
m := map[KeyType]ValueType{
"Key1":value1,
"Key2":value2,
}

大括号内也可以为空

1
m := map[string]int{}

通过使用空接口,可以在同一个map中存储不同类型的value

1
2
3
4
m := map[string]interface{}{
"name": "张三", //string
"age": 18, //int
}

CRUD

追加键值对

直接通过键+值的方式就可以追加一堆键值对

1
2
m["李四"] = 20
m["王五"] = 22

判断某个键是否存在

Go语言在通过Key访问键值对时,会返回两个值

1
value, ok := map[key]

value是key所对的值,ok是该值是否存在,为一个bool

若值不存在,则value会得到一个0值,且ok会得到false

1
2
3
4
5
6
7
8
9
scoreMap := map[string]int{
"张三" : 90,
}

if v, ok := scoreMap["张三"]; ok {
fmt.Println(v)
} else {
fmt.Println("查无此人")
}

遍历map

Go语言中使用for range遍历map

1
2
3
4
5
6
7
8
9
10
11
12
scoreMap := map[string]int{
"张三": 90,
"李四": 95,
}

for k, v := range scoreMap {
fmt.Print(k + " ")
fmt.Println(v)
}
for _, v := range scoreMap { //只遍历value
fmt.Println(v)
}

**注意:**由于map本身的性质,因此遍历的顺序与添加键值对的顺序无关

有没有办法指定顺序遍历呢?是可以的。

指定顺序遍历

具体步骤:

  1. 构建一个切片,将key存入
  2. 对切片排序
  3. 按照切片中key的顺序遍历map
1
2
3
4
5
6
7
8
9
10
11
//1.构建一个切片, 并将key存入
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//2.对切片进行排序
sort.Strings(keys)
//3.按照切片中key的顺序遍历map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}

修改值

分为两种情况

  • 一般情况下,直接用下标访问修改即可

    1
    scoreMap["张三"] += 10
  • 如果值是一个结构体等复杂结构,就不能直接修改下标访问到的结构体中的内部值,需要重新构建一个新的结构体,重新给map赋值

删除键值对

使用delete()内建函数从map中删除一组键值对

1
delete(map, key)

map为要删除键值对的map,key为所对的键,例子

1
delete(scoreMap, "张三")

切片相关

元素为map类型的切片

1
2
3
4
5
6
7
8
//1.切片的初始化
//构建了一个长度容量为3的切片,只完成了切片的初始化,map均为nil值
var mapSlice = make([]map[string]int, 3)
//2.map的初始化
mapSlice[0] = make(map[string]int)
//3.即可正常对mapSlice追加键值对
mapSlice[0]["张三"] = 100
fmt.Println(mapSlice)

值为切片类型的map

构建一个各个国家包含的城市的map:

1
2
3
4
5
6
7
8
//1.map的初始化,没有完成切片的初始化
var sliceMap = make(map[string][]string)
//2.切片初始化
key := "中国"
sliceMap[key] = make([]string, 0, 8) //长度0,容量8的
//3.添加元素,测试
sliceMap[key] = append(sliceMap[key], "北京", "上海")
fmt.Println(sliceMap)