Go Map
Go Map
Map 用於以 key:value 對的形式儲存資料值。
Map 中的每個元素都是一個 key:value 對。
Map 是一個無序且可變的集合,不允許重複。
Map 的長度是其元素的數量。您可以使用 len()
函式找到它。
Map 的預設值為 nil。
Map 引用底層雜湊表。
Go 提供了多種建立 Map 的方法。
使用 var
和 :=
建立 Map
語法
var a = map[KeyType]ValueType{key1:value1, key2:value2,...}
b := map[KeyType]ValueType{key1:value1, key2:value2,...}
示例
此示例展示瞭如何在 Go 中建立 Map。請注意程式碼中的順序和輸出中的順序。
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
結果
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
注意:程式碼中定義的 Map 元素的順序與它們儲存的方式不同。資料以高效檢索 Map 的方式儲存。
使用 make()
函式建立 Map
語法
var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)
示例
此示例展示瞭如何使用 make()
函式在 Go 中建立 Map。
package main
import ("fmt")
func main() {
var a = make(map[string]string) // Map 現在是空的
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
// a 不再是空的
b := make(map[string]int)
b["Oslo"] = 1
b["Bergen"] = 2
b["Trondheim"] = 3
b["Stavanger"] = 4
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
結果
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
建立一個空 Map
有兩種建立空 Map 的方法。一種是使用 make()
函式,另一種是使用以下語法。
語法
var a map[KeyType]ValueType
注意: make()
函式是建立空 Map 的正確方法。如果您以其他方式建立空 Map 並向其寫入資料,則會導致執行時恐慌。
示例
此示例顯示了使用 make()
函式和不使用它來宣告空 Map 之間的區別。
package main
import ("fmt")
func main() {
var a = make(map[string]string)
var b map[string]string
fmt.Println(a == nil)
fmt.Println(b == nil)
}
結果
false
true
允許的鍵型別
Map 鍵可以是任何定義了相等運算子(==
)的資料型別。這些包括
- 布林值
- 數字
- 字串
- 陣列
- 指標
- 結構體
- 介面(只要動態型別支援相等性)
無效的鍵型別為
- 切片
- Map
- 函式
這些型別無效,因為相等運算子(==
)未為其定義。
允許的值型別
Map 的值可以是任何型別。
訪問 Map 元素
您可以透過以下方式訪問 Map 元素
語法
value = map_name[key]
示例
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Printf(a["brand"])
}
結果
福特
更新和新增 Map 元素
更新或新增元素的方法是
語法
map_name[key] = value
示例
此示例展示瞭如何更新和新增 Map 中的元素。
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
a["year"] = "1970" // 更新一個元素
a["color"] = "red" // 新增一個元素
fmt.Println(a)
}
結果
map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]
從 Map 中刪除元素
使用 delete()
函式刪除元素。
語法
delete(map_name, key)
示例
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
delete(a,"year")
fmt.Println(a)
}
結果
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang]
檢查 Map 中的特定元素
您可以使用以下方法檢查 Map 中是否存在某個鍵
語法
val, ok :=map_name[key]
如果您只想檢查某個鍵是否存在,可以使用空白識別符號(_
)代替 val。
示例
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day":""}
val1, ok1 := a["brand"] // 檢查存在的鍵及其值
val2, ok2 := a["color"] // 檢查不存在的鍵及其值
val3, ok3 := a["day"] // 檢查存在的鍵及其值
_, ok4 := a["model"] // 只檢查存在的鍵而不檢查其值
fmt.Println(val1, ok1)
fmt.Println(val2, ok2)
fmt.Println(val3, ok3)
fmt.Println(ok4)
}
結果
Ford true
false
true
true
示例解釋
在此示例中,我們檢查了 Map 中不同鍵的存在性。
鍵 "color" 不存在於 Map 中。因此,值為空字串('')。
ok2 變數用於判斷鍵是否存在。因為即使 "color" 鍵的值為空,我們也會得到相同的值。val3 的情況也是如此。
Map 是引用
Map 是雜湊表的引用。
如果兩個 Map 變數引用同一個雜湊表,則更改一個變數的內容會影響另一個變數的內容。
示例
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := a
fmt.Println(a)
fmt.Println(b)
b["year"] = "1970"
fmt.Println("After change to b:")
fmt.Println(a)
fmt.Println(b)
}
結果
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang year:1964]
更改 b 後
map[brand:Ford model:Mustang year:1970]
map[brand:Ford model:Mustang year:1970]
遍歷 Map
您可以使用 range
來遍歷 Map。
示例
此示例展示瞭如何遍歷 Map 中的元素。請注意輸出中元素的順序。
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
for k, v := range a {
fmt.Printf("%v : %v, ", k, v)
}
}
結果
two : 2, three : 3, four : 4, one : 1,
按特定順序遍歷 Map
Map 是無序資料結構。如果您需要按特定順序遍歷 Map,則必須有一個單獨的資料結構來指定該順序。
示例
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
var b []string // 定義順序
b = append(b, "one", "two", "three", "four")
for k, v := range a { // 無序迴圈
fmt.Printf("%v : %v, ", k, v)
}
fmt.Println()
for _, element := range b { // 按定義的順序迴圈
fmt.Printf("%v : %v, ", element, a[element])
}
}
結果
two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,