十二、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)
// 函數內的更改,影響原來的元素
}