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