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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM