Go語言的字典(Map)類型實際上是哈希表(Hash Table)的一個實現。字典用於存儲鍵-元素對(更通俗的說法是鍵-值對)的無序集合。注意,同一個字典中的每一個鍵都是惟一的。若是咱們在向字典中放入一個鍵值對的時候其中已經有相同的鍵的話,那麼與此鍵關聯的那個值會被新值替換。
字典類型的字面量以下:數組
map[K]T
其中,「K」意爲鍵的類型,而「T」則表明元素(或稱值)的類型。若是咱們要描述一個鍵類型爲int
、值類型爲string
的字典類型的話,應該這樣寫:函數
map[int]string
請注意,字典的鍵類型必須是可比較的,不然會引發錯誤。也就是說,它不能是切片、字典或函數類型。
字典值的字面量表示法實際上與數組和切片的字面量表示法很類似。首先,最左邊仍然是類型字面量,右邊緊挨着由花括號包裹且有英文逗號分隔的鍵值對。每一個鍵值對的鍵和值之間由英文冒號分隔。以字典類型map[int]string
爲例,它的值的字面量能夠是這樣的:spa
map[int]string{1: "a", 2: "b", 3: "c"}
咱們能夠把這個值賦給一個變量:code
mm := map[int]string{1: "a", 2: "b", 3: "c"}
而後運用索引表達式取出字典中的值,就像這樣:索引
b := mm[2]
注意,在這裏,咱們放入方括號中的再也不是索引值(實際上,字典中的鍵值對也沒有索引),而是與咱們要取出的值對應的那個鍵。在上例中變量b
的值必是字符串"b"
。固然,也能夠利用索引表達式來賦值,好比這樣:字符串
mm[2] = b + "2"
這使得字典mm
中與鍵2
對應的值變爲了"b2"
。如今咱們再來向mm
添加一個鍵值對:string
mm[4] = ""
以後,在從中取出與`4
`和`5
`對應的值:變量
d := mm[4] e := mm[5]
此時,變量d
和e
的值都會是多少呢?答案是都爲""
,即空字符串。對於變量d
來講,因爲在字典mm
中與4
對應的值就是""
,因此索引表達式mm[4]
的求值結果必爲""
。這理所應當。可是mm[5]
的求值結果爲何也是空字符串呢?緣由是,在Go語言中有這樣一項規定,即:對於字典值來講,若是其中不存在索引表達式欲取出的鍵值對,那麼就以它的值類型的空值(或稱默認值)做爲該索引表達式的求值結果。因爲字符串類型的空值爲""
,因此mm[5]
的求值結果即爲""
。
在不知道mm
的確切值的狀況下,咱們沒法得知mm[5]
的求值結果意味着什麼?它意味着5
對應的值就是一個空字符串?仍是說mm
中根本就沒有鍵爲5
的鍵值對?這無所判別。爲了解決這個問題,Go語言爲咱們提供了另一個寫法,即:map
e, ok := mm[5]
針對字典的索引表達式能夠有兩個求值結果。第二個求值結果是bool
類型的。它用於代表字典值中是否存在指定的鍵值對。在上例中,變量ok
必爲false
。由於mm
中不存在以5
爲鍵的鍵值對。
從字典中刪除鍵值對的方法很是簡單,僅僅是調用內建函數delete
而已,就像這樣:引用
delete(mm, 4)
不管mm
中是否存在以4
爲鍵的鍵值對,delete
都會「無聲」地執行完畢。咱們用「有則刪除,無則不作」能夠很好地歸納它的行爲。
最後,與切片類型相同,字典類型屬於引用類型。它的零值即爲nil
。