Go開發(fā)工程師
未來3-5年企業(yè)高性能項目不可替代的語言,從基礎(chǔ)到項目實戰(zhàn)再到重構(gòu),真正從入門到精通
Go語言的字典(Map)類型其實是哈希表(Hash Table)的一個實現(xiàn)。字典用于存儲鍵-元素對(更通俗的說法是鍵-值對)的無序集合。注意,同一個字典中的每個鍵都是唯一的。如果我們在向字典中放入一個鍵值對的時候其中已經(jīng)有相同的鍵的話,那么與此鍵關(guān)聯(lián)的那個值會被新值替換。
字典類型的字面量如下:
map[K]T
其中,“K”意為鍵的類型,而“T”則代表元素(或稱值)的類型。如果我們要描述一個鍵類型為int
、值類型為string
的字典類型的話,應(yīng)該這樣寫:
map[int]string
請注意,字典的鍵類型必須是可比較的,否則會引起錯誤。也就是說,它不能是切片、字典或函數(shù)類型。
字典值的字面量表示法實際上與數(shù)組和切片的字面量表示法很相似。首先,最左邊仍然是類型字面量,右邊緊挨著由花括號包裹且有英文逗號分隔的鍵值對。每個鍵值對的鍵和值之間由英文冒號分隔。以字典類型map[int]string
為例,它的值的字面量可以是這樣的:
map[int]string{1: "a", 2: "b", 3: "c"}
我們可以把這個值賦給一個變量:
mm := map[int]string{1: "a", 2: "b", 3: "c"}
然后運用索引表達(dá)式取出字典中的值,就像這樣:
b := mm[2]
注意,在這里,我們放入方括號中的不再是索引值(實際上,字典中的鍵值對也沒有索引),而是與我們要取出的值對應(yīng)的那個鍵。在上例中變量b
的值必是字符串"b"
。當(dāng)然,也可以利用索引表達(dá)式來賦值,比如這樣:
mm[2] = b + "2"
這使得字典mm
中與鍵2
對應(yīng)的值變?yōu)榱?code class="marker">"b2"?,F(xiàn)在我們再來向mm
添加一個鍵值對:
mm[4] = ""
之后,在從中取出與`4
`和`5
`對應(yīng)的值:
d := mm[4] e := mm[5]
此時,變量d
和e
的值都會是多少呢?答案是都為""
,即空字符串。對于變量d
來說,由于在字典mm
中與4
對應(yīng)的值就是""
,所以索引表達(dá)式mm[4]
的求值結(jié)果必為""
。這理所應(yīng)當(dāng)。但是mm[5]
的求值結(jié)果為什么也是空字符串呢?原因是,在Go語言中有這樣一項規(guī)定,即:對于字典值來說,如果其中不存在索引表達(dá)式欲取出的鍵值對,那么就以它的值類型的空值(或稱默認(rèn)值)作為該索引表達(dá)式的求值結(jié)果。由于字符串類型的空值為""
,所以mm[5]
的求值結(jié)果即為""
。
在不知道mm
的確切值的情況下,我們無法得知mm[5]
的求值結(jié)果意味著什么?它意味著5
對應(yīng)的值就是一個空字符串?還是說mm
中根本就沒有鍵為5
的鍵值對?這無所判別。為了解決這個問題,Go語言為我們提供了另外一個寫法,即:
e, ok := mm[5]
針對字典的索引表達(dá)式可以有兩個求值結(jié)果。第二個求值結(jié)果是bool
類型的。它用于表明字典值中是否存在指定的鍵值對。在上例中,變量ok
必為false
。因為mm
中不存在以5
為鍵的鍵值對。
從字典中刪除鍵值對的方法非常簡單,僅僅是調(diào)用內(nèi)建函數(shù)delete
而已,就像這樣:
delete(mm, 4)
無論mm
中是否存在以4
為鍵的鍵值對,delete
都會“無聲”地執(zhí)行完畢。我們用“有則刪除,無則不做”可以很好地概括它的行為。
最后,與切片類型相同,字典類型屬于引用類型。它的零值即為nil
。
請在命令源碼文件index.go的第 7、8、9 行中填入相應(yīng)代碼,使程序打印到標(biāo)準(zhǔn)輸出上的內(nèi)容為:25, 50, 0
。
可以填入:
mm2["scala"] = 25 mm2["erlang"] = 50 delete(mm2, "python")
注意,答案并不是唯一的。
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報