Go中的Map

她們都叫我劍俠發表於2018-08-07

Go中的Map

概念

  1. map是一種資料結構, 一個集合, 儲存一系列無序的鍵值對
  2. map基於儲存的, 鍵值相當於索引
  3. map可以通過鍵快速索引資料, 鍵指向該鍵關聯的值

內部實現

  1. map是給予hash(雜湊表)來實現的, 每次列印的key和value都是無序的, 每次迭代都不一樣
  2. map的雜湊表包含一組桶, 每次儲存和查詢鍵值對的時候, 都要先選擇一個桶, 就是把指定的鍵傳給雜湊函式, 就可以索引到相應的桶, 進而找到對應的鍵值
  3. map儲存的是無序的鍵值對集合, 儲存的資料越多, 索引分佈越均勻, 反問鍵值對的速度就越快

宣告和初始化

  1. 使用make進行建立map
    dict := make(map[string]int)
    dict["aaa"] = 123
    複製程式碼
  2. 使用:=進行建立和初始化map
    dict := map[string]int{"aaa": 123, "bbb": 456}
    複製程式碼
  3. 使用:=建立一個空的map
    dict := map[string]int{}
    複製程式碼
  4. 使用make建立一個值為nil的map
    var dict map[string]int
    // 建立為nil的map後不能直接操作, 必須先初始化
    dict = make(map[string]int)
    dict['aaa'] = 123
    複製程式碼

map的特性

  1. map的鍵可以是任何值, 鍵的型別可以是任何型別(也可以是結構型別)
  2. 鍵值可以使用==進行比較, 所以像切片, 函式和含有切片的結構型別就不能使用map進行構建, 他們具有引用的語義無法進行比較
  3. 切片等不能再鍵中使用, 可以在值中使用

使用map

  1. 通過鍵設定和獲得map中的值

    dict := make(map[string]int)
    dict['aaa'] = 123
    count := dict['aaa']
    複製程式碼
  2. 判斷值是否存在

    count, age := dict['aaa']
    if (age != nil) {
        ...
    }
    複製程式碼
  3. 使用delete刪除map中的鍵值對

    delete(dict, 'aaa')
    複製程式碼
  4. 使用for range遍歷map

    func main() {
    	dict := map[string]int{"王五": 60, "張三": 43}
    	var names []string
    	for name := range dict {
    		names = append(names, name)
    	}
    	sort.Strings(names) //排序
    	for _, key := range names {
    		fmt.Println(key, dict[key])
    	}
    }
    複製程式碼

函式間傳遞map

函式中的map傳遞不會複製, 函式中修改鍵值對會對原來的map產生影響, 屬於引用傳遞

func main() {
	dict := map[string]int{"王五": 60, "張三": 43}
	modify(dict)
	fmt.Println(dict["張三"])
}
func modify(dict map[string]int) {
	dict["張三"] = 10
}
複製程式碼

相關文章