十二、map
1 map集合
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。
2 创建map
声明一个map集合
var map_variable map[key_data_type]value_data_type
// 比如,声明一个key和value都是字符串类型的集合
var countryCapitalMap map[string]string
上面的例子中,如果声明但不初始化 map,那么就会创建一个 nil map
。nil map
不能用来存放键值对,如果你添加键值,编译器会提示panic: assignment to entry in nil map
错误,所以需要使用 make
函数初始化。
var countryCapitalMap map[string]string // 声明一个nil集合
countryCapitalMap = make(map[string]string) // 使用make初始化
countryCapitalMap["k1"] = "v1"
countryCapitalMap["k2"] = "v2"
fmt.Println(countryCapitalMap)
可以使用类型推导,省去声明的步骤,直接用make函数创建集合
map_variable := make(map[key_data_type]value_data_type)
// key_data_type是key的类型
// value_data_type是value的类型
你也可以在声明时初始化集合,比如
money := map[string]int {
"steve": 12000,
"jamie": 15000,
}
3 添加元素
你可以使用中括号为map赋值,要注意key不能重复
countryCapitalMap["k1"] = "v1"
countryCapitalMap["k2"] = "v2"
也可以声明时初始化赋值
status := map[int]string{
200: "OK",
404: "Not Found",
}
fmt.Println(status)
4 获取元素
获取map中元素的方法很简单,使用中括号取值即可。
status := map[int]string{
200: "OK",
404: "Not Found",
}
//res := status[200]
res := status[404]
fmt.Println(status)
fmt.Println(res)
如果获取一个不存在的元素,会返回一个0
而不会返回错误。
student := make(map[string]int)
student["mike"] = 18
student["lily"] = 20
student["bob"] = 22
fmt.Println(student["bbb"])
要查看元素在集合中是否存在,可以这样做:
value, ok := student["bbb"]
fmt.Println(value) // 返回'bbb'对应的值,如果不存在返回0
fmt.Println(ok) // 如果key存在返回true,key不存在返回false
5 遍历map
可以使用for range
语法遍历map,但是每次遍历都是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用哈希表来实现的。
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
for country, capital := range countryCapitalMap {
fmt.Print(country)
fmt.Print(capital)
fmt.Print("\n")
}
6 delete函数删除元素
要删除map中的元素,使用delete函数,语法是 delete(map, key)
student := make(map[string]int)
student["mike"] = 18
student["lily"] = 20
student["bob"] = 22
delete(student, "mike") // 删除key为mike的元素
fmt.Println(student)
7 获取map的长度
使用len函数获取map长度
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
fmt.Println(len(countryCapitalMap))
8 map的函数传递
集合map可以作为参数传递。map和切片一样是引用类型,当map作为参数传递给函数时,即使是值传递,也将引用相同的底层数据结构,函数内所做的更改也会在函数外可见。
func add(m map[string]int) {
for key, value := range m {
m[key] = value + 1
}
}
func main() {
people := map[string]int{"mike": 18, "lily": 17, "bob": 15}
add(people)
fmt.Println(people)
// 函数内的更改,影响原来的元素
}