Go語言 字典型別

2021-08-19 14:35:58 字數 2027 閱讀 3687

go語言的字典(map)型別其實是雜湊表(hash table)的乙個實現。字典用於儲存鍵-元素對(更通俗的說法是鍵-值對)的無序集合。注意,同乙個字典中的每個鍵都是唯一的。如果我們在向字典中放入乙個鍵值對的時候其中已經有相同的鍵的話,那麼與此鍵關聯的那個值會被新值替換。

字典型別的字面量如下:

map[k]t
其中,「k」意為鍵的型別,而「t」則代表元素(或稱值)的型別。如果我們要描述乙個鍵型別為int、值型別為string的字典型別的話,應該這樣寫:

map[int]string
請注意,字典的鍵型別必須是可比較的,否則會引起錯誤。也就是說,它不能是切片、字典或函式型別。

字典值的字面量表示法實際上與陣列和切片的字面量表示法很相似。首先,最左邊仍然是型別字面量,右邊緊挨著由花括號包裹且有英文逗號分隔的鍵值對。每個鍵值對的鍵和值之間由英文冒號分隔。以字典型別map[int]string為例,它的值的字面量可以是這樣的:

map[int]string
我們可以把這個值賦給乙個變數:

mm := map[int]string
然後運用索引表示式取出字典中的值,就像這樣:

b := mm[2]
注意,在這裡,我們放入方括號中的不再是索引值(實際上,字典中的鍵值對也沒有索引),而是與我們要取出的值對應的那個鍵。在上例中變數b的值必是字串"b"。當然,也可以利用索引表示式來賦值,比如這樣:

mm[2] = b + "2"
這使得字典mm中與鍵2對應的值變為了"b2"。現在我們再來向mm新增乙個鍵值對:

mm[4] = ""
之後,在從中取出與`4`和`5`對應的值:

d := mm[4]

e := mm[5]

此時,變數de的值都會是多少呢?答案是都為"",即空字串。對於變數d來說,由於在字典mm中與4對應的值就是"",所以索引表示式mm[4]的求值結果必為""。這理所應當。但是mm[5]的求值結果為什麼也是空字串呢?原因是,在go語言中有這樣一項規定,即:對於字典值來說,如果其中不存在索引表示式欲取出的鍵值對,那麼就以它的值型別的空值(或稱預設值)作為該索引表示式的求值結果。由於字串型別的空值為"",所以mm[5]的求值結果即為""

在不知道mm的確切值的情況下,我們無法得知mm[5]的求值結果意味著什麼?它意味著5對應的值就是乙個空字串?還是說mm中根本就沒有鍵為5的鍵值對?這無所判別。為了解決這個問題,go語言為我們提供了另外乙個寫法,即:

e, ok := mm[5]
針對字典的索引表示式可以有兩個求值結果。第二個求值結果是bool型別的。它用於表明字典值中是否存在指定的鍵值對。在上例中,變數ok必為false。因為mm中不存在以5為鍵的鍵值對。

從字典中刪除鍵值對的方法非常簡單,僅僅是呼叫內建函式delete而已,就像這樣:

delete(mm, 4)
無論mm中是否存在以4為鍵的鍵值對,delete都會「無聲」地執行完畢。我們用「有則刪除,無則不做」可以很好地概括它的行為。

最後,與切片型別相同,字典型別屬於引用型別。它的零值即為nil

go 函式 作為型別 go語言

在go語言中國 可以把 函式作為一種型別 用 type 定義。利用這種特性 可以進行型別轉換。可以用作函式引數的 型別 來約束引數。型別轉換的基本格式如下 type name expression package main import fmt 宣告乙個函式型別 type calculatetype...

Go語言 通道型別

通道 channel 是go語言中一種非常獨特的資料結構。它可用於在不同goroutine之間傳遞型別化的資料,並且是併發安全的。相比之下,我們之前介紹的那些資料型別都不是併發安全的。這一點需要特別注意。goroutine 也稱為go程式 可以被看做是承載可被併發執行的 塊的載體。它們由go語言的執...

go語言型別轉換

string到int int,err strconv.atoi string string到int64 int64,err strconv.parseint string,10,64 第二個引數為基數 2 36 第三個引數位大小表示期望轉換的結果型別,其值可以為0,8,16,32和64,分別對應 i...