Map 哈希表是一種巧妙並且實用的數據結構。它是一個無序的key/value對的集合,其中所有的key 都是不同的,然後通過給定的key可以在常數時間複雜度內檢索、更新或刪除對應的value。 在Go語言中,一個map就是一個哈希表的引用,map類型可以寫為map[K]V,其中K和V分別 對 ...
Map
哈希表是一種巧妙並且實用的數據結構。它是一個無序的key/value對的集合,其中所有的key 都是不同的,然後通過給定的key可以在常數時間複雜度內檢索、更新或刪除對應的value。
在Go語言中,一個map就是一個哈希表的引用,map類型可以寫為map[K]V,其中K和V分別 對應key和value。map中所有的key都有相同的類型,所有的value也有著相同的類型,但是 key和value之間可以是不同的數據類型。
創建map
// 使用make創建map
robotName := make(map[string]string)
// 通過字面值創建map,同時還能初始化一系列鍵值對
robotName := map[string]string{
"robot01": "Alice",
"robot02": "Jack",
"robot03": "Tom",
}
map的增刪改查
// 新增map元素
robotName["robot04"] = "Cindy"
// 訪問map中元素
fmt.Println(robotName["robot01"]) // robot01 : Alice
// 查詢map中元素個數
fmt.Println(len(robotName)) // 4
// 刪除map中元素
delete(robotName, "robot03")
// 判斷是否有這個元素,ok是bool類型,如果有返回true,反之返回false
name, ok := robotName["robot0"]
fmt.Println(name) // Alice
fmt.Println(ok) // true
map的遍歷
要想遍歷map中全部的key/value對的話,可以使用range風格的for迴圈實現,和之前的slice遍 歷語法類似。但是,Map的迭代順序是不確定的,並且不同的哈希函數實現可能導致不同的遍歷順序。
// 通過range迴圈遍歷map
for index, value := range robotName {
fmt.Println(index + " : " + value)
}
/*
robot01 : Alice
robot02 : Jack
robot04 : Cindy
*/
嵌套map
Map的value類型也可以是一個聚合類型,比如是一個map或slice,
// 聲明嵌套map
robotInfo := map[string]map[string]string{}
// 因為上面的聲明語句只分配了外層空間,所以需要通過make分配內層空間
// 寫法1
robotInfo["robot01"] = make(map[string]string)
robotInfo["robot01"]["name"] = "Alice"
robotInfo["robot01"]["age"] = "18"
// 寫法2
robotInfo["robot02"] = map[string]string{
"name": "Bob",
"age": "20",
}
// 遍歷嵌套map
for index1, value1 := range robotInfo {
for index2, value2 := range value1 {
fmt.Println(index1 + " : " + index2 + " : " + value2)
}
}