C語言中文網 目錄
首頁 > Go語言教程 > Go語言容器 閱讀:5,163

Go語言map(Go語言映射)

在業務和算法中需要使用任意類型的關聯關系時,就需要使用到映射,如學號和學生的對應、名字與檔案的對應等。

Go 語言提供的映射關系容器為 map,map使用散列表(hash)實現。

提示

大多數語言中映射關系容器使用兩種算法:散列表和平衡樹。

散列表可以簡單描述為一個數組(俗稱“桶”),數組的每個元素是一個列表。根據散列函數獲得每個元素的特征值,將特征值作為映射的鍵。如果特征值重復,表示元素發生碰撞。碰撞的元素將被放在同一個特征值的列表中進行保存。散列表查找復雜度為 O(1),和數組一致。最壞的情況為 O(n),n 為元素總數。散列需要盡量避免元素碰撞以提高查找效率,這樣就需要對“桶”進行擴容,每次擴容,元素需要重新放入桶中,較為耗時。

平衡樹類似于有父子關系的一棵數據樹,每個元素在放入樹時,都要與一些節點進行比較。平衡樹的查找復雜度始終為 O(log n)。

添加關聯到 map 并訪問關聯和數據

Go 語言中 map 的定義是這樣的:

map[KeyType]ValueType

  • KeyType為鍵類型。
  • ValueType是鍵對應的值類型。

一個 map 里,符合 KeyType 和 ValueType 的映射總是成對出現。

下面代碼展示了 map 的基本使用環境。
scene := make(map[string]int)

scene["route"] = 66

fmt.Println(scene["route"])

v := scene["route2"]
fmt.Println(v)
代碼輸出如下:
66
0

代碼說明如下:
  • 第 1 行 map 是一個內部實現的類型,使用時,需要手動使用 make 創建。如果不創建使用 map 類型,會觸發宕機錯誤。
  • 第 3 行向 map 中加入映射關系。寫法與使用數組一樣,key 可以使用除函數以外的任意類型。
  • 第 5 行查找 map 中的值。
  • 第 7 行中,嘗試查找一個不存在的鍵,那么返回的將是 ValueType 的默認值。

某些情況下,需要明確知道查詢中某個鍵是否在 map 中存在,可以使用一種特殊的寫法來實現,看下面的代碼:
v, ok := scene["route"]
在默認獲取鍵值的基礎上,多取了一個變量 ok,可以判斷鍵 route 是否存在于 map 中。

map 還有一種在聲明時填充內容的方式,代碼如下:
m := map[string]string{
    "W": "forward",
    "A": "left",
    "D": "right",
    "S": "backward",
}
例子中并沒有使用 make,而是使用大括號進行內容定義,就像 JSON 格式一樣,冒號的左邊是 key,右邊是值,鍵值對之間使用逗號分隔。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo