字典(map)是一种底层基于哈希的,高效的数据结构。
map存储的是键值对,以key为键,计算出哈希值后,取出对应的value

定义

map的使用方式很简单,声明时指定key的类型、value的类型,便可以得到一个mapmap[key_type]value_type,其中 key_type 是键的类型, value_type 是值的类型。

1
2
3
4
5
6
7
8
9
// 声明式,定义了一个键为string,值为int
var map1 map[string]int

// 赋值声明
map2 := map[string]string{}

map3 := map[int]string{
1: "one",
}

设值

key的赋值,可以直接用=

1
2
3
map2 := map[string]string{}
// 其中,key = "name", value = "Bob"
map2["name"] = "Bob"

取值

从map中取值,也是使用=,但是要注意的是,键不存在的情况,需要进行判断处理。

1
val, ok := map2["name2"]

在上面的例子中,因为name2这个key在map2中不存在,所以我们取到的val是空的,在某些场景下,如果没有对是否存在进行校验,那么可能存在预期外的异常或逻辑错误。

ok的类型是布尔值,表示是否真正取得了数据。根据它,我们可以知道对应的key在字典中是否真的存在。

使用range遍历

使用关键字range,我们可以对map进行遍历:

1
2
3
4
5
6
7
8
9
map4 := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}

for k, v := range map4 {
fmt.Println(k, v)
}

如果你运行了上面这段代码,你会发现输出的顺序不是a,b,c。因为在map的实现里,key是hash的结构存储,而不是顺序的,这也是它存储高效的原因。

删除值

如果我们想删除某一对key/value,可以使用内置的delete方法:

1
2
3
4
5
6
map4 := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}
delete(map4, "b")

比如上面的代码,将删除map4keyb的键值对。