Loading

map

十二、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 mapnil 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)
	// 函数内的更改,影响原来的元素
}
posted @ 2021-12-10 08:48  yyyz  阅读(216)  评论(0编辑  收藏  举报