爲了擴大一點就已經給了答案:
一去的地圖是類型化的哈希映射數據結構。地圖的類型簽名的格式爲map[keyType]valueType
,其中keyType
和valueType
分別是鍵和值的類型。
要初始化地圖,你必須使用make
功能:
m := make(map[string]int)
未初始化的地圖等於nil
,如果讀取或寫入恐慌將出現在運行時。
用於存儲值的語法是一樣一樣的使用數組或切片這樣做:
m["Alice"] = 21
m["Bob"] = 17
同樣,從地圖檢索值可以這樣判定:
a := m["Alice"]
b := m["Bob"]
您可以使用range
關鍵字用於遍歷for
循環的地圖:
for k, v := range m {
fmt.Println(k, v)
}
這個代碼將打印:
Alice 21
Bob 17
檢索的關鍵不在地圖將返回值類型的零值的值:
c := m["Charlie"]
// c == 0
通過從地圖讀取多個值,可以測試密鑰的存在。第二個值將是一個布爾值,指示鍵的存在:
a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false
要從地圖的鍵/值項,你翻轉過來,並指定false
作爲第二個值:
m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false
你
n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"
唯一條件是檢索這些值時:可以通過使用空接口類型interface{}
存儲在地圖任意類型你必須執行一個類型斷言使用它們原來的形式:
a := n["One"].(int)
b := n["Two"].(string)
可以使用式開關,以確定各類你拉出值,並與他們妥善處理:
for k, v := range n {
switch u := v.(type) {
case int:
fmt.Printf("Key %q is an int with the value %v.\n", k, u)
case string:
fmt.Printf("Key %q is a string with the value %q.\n", k, u)
}
}
在這些case
塊的每一箇中,u
將是case
聲明中指定的類型;沒有明確的類型斷言是必要的。
此代碼將打印:
Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
密鑰可以是用於其等於運算符被定義,如整數的任何類型,浮點數,字符串和指針。只要底層類型支持相等性,也可以使用接口類型。 (結構,數組和切片不能被用作映射鍵,因爲平等未在這些類型的定義。)
例如,地圖o
可以採取任何上述類型的鍵:
o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2
簡而言之,這就是地圖。
不需要條件語句,只需執行'm [key] ++'就更加通俗易懂。如果密鑰確實存在,則獲得零值。 – 2015-09-10 11:30:09