golang-101-hacks(18)——map類型訪問

注:本文是對(duì)golang-101-hacks中文翻譯。
Map是一種指向哈希表的引用類型滴铅,可以使用map構(gòu)造一個(gè)“鍵值”類型的數(shù)據(jù)庫吕喘,這在實(shí)際編程中非常高效赘那。例如,下面的代碼是統(tǒng)計(jì)切片中每個(gè)元素的總數(shù):

package main

import (
    "fmt"
)

func main() {
    s := []int{1, 1, 2, 2, 3, 3, 3}
    m := make(map[int]int)

    for _, v := range s {
        m[v]++
    }

    for key, value := range m {
        fmt.Printf("%d occurs %d times\n", key, value)
    }
} 

運(yùn)行結(jié)果

3 occurs 3 times
1 occurs 2 times
2 occurs 2 times

此外氯质,根據(jù)Go spec:“map是一個(gè)無序的元素組合募舟,其中一種類型稱為元素類型,另一種類型(稱為鍵類型)是由惟一鍵索引組成闻察」敖福”如果再次運(yùn)行上述程序,輸出結(jié)果可能會(huì)有所不同:
Moreover, according to Go spec: "A map is an unordered group of elements of one type, called the element type, indexed by a set of unique keys of another type, called the key type.". So if you run the above program another time, the output may be different:

2 occurs 2 times
3 occurs 3 times
1 occurs 2 times

你無法推測map的元素順序辕漂。
map的鍵必須滿足與“ ==”運(yùn)算符進(jìn)行比較:內(nèi)置類型(如int呢灶,string等)滿足此要求; 而切片不可以。對(duì)于struct類型钉嘹,如果其成員都可以通過“ ==”運(yùn)算符進(jìn)行比較鸯乃,那么此結(jié)構(gòu)也可以用作鍵。
當(dāng)您訪問鍵不存在時(shí)跋涣,map將返回nil缨睡。即

package main

import (
    "fmt"
)

func main() {
    m := make(map[int]bool)

    m[0] = false
    m[1] = true

    fmt.Println(m[0], m[1], m[2])
}

輸出結(jié)果如下

false true false

m[0]m[2]的值都是' false '鸟悴,所以您不能判斷鍵是否真的存在在map中。解決方法是使用多返回值的“comma-ok”模式:

value, ok := map[key]

如果key存在 ok返回值是true 否則是false
有時(shí)奖年,你可能不需要map的值细诸,而只是將map作為一個(gè)集合使用。在這種情況下陋守,您可以將map的值聲明為空結(jié)構(gòu)體:struct{}震贵。如下面的例子:

package main

import (
    "fmt"
)

func check(m map[int]struct{}, k int) {
    if _, ok := m[k]; ok {
        fmt.Printf("%d is a valid key\n", k)
    }
}
func main() {
    m := make(map[int]struct{})
    m[0] = struct{}{}
    m[1] = struct{}{}

    for  i := 0; i <=2; i++ {
        check(m, i)
    }
}  

輸出結(jié)果如下

0 is a valid key
1 is a valid key

使用內(nèi)置函數(shù)delete刪除map上的元素,即使這個(gè)鍵不存在也不會(huì)報(bào)錯(cuò)。

delete(map, key)

參考:
Effective Go;
The Go Programming Language Specification;
The Go Programming Language.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末水评,一起剝皮案震驚了整個(gè)濱河市猩系,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌中燥,老刑警劉巖蝙眶,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異褪那,居然都是意外死亡幽纷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門博敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來友浸,“玉大人,你說我怎么就攤上這事偏窝∈栈郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵祭往,是天一觀的道長伦意。 經(jīng)常有香客問我,道長硼补,這世上最難降的妖魔是什么驮肉? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮已骇,結(jié)果婚禮上离钝,老公的妹妹穿的比我還像新娘。我一直安慰自己褪储,他們只是感情好卵渴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲤竹,像睡著了一般浪读。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天碘橘,我揣著相機(jī)與錄音论泛,去河邊找鬼。 笑死蛹屿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岩榆。 我是一名探鬼主播错负,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勇边!你這毒婦竟也來了犹撒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤粒褒,失蹤者是張志新(化名)和其女友劉穎识颊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奕坟,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祥款,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了月杉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃跛。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苛萎,靈堂內(nèi)的尸體忽然破棺而出桨昙,到底是詐尸還是另有隱情,我是刑警寧澤腌歉,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蛙酪,位于F島的核電站,受9級(jí)特大地震影響翘盖,放射性物質(zhì)發(fā)生泄漏桂塞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一馍驯、第九天 我趴在偏房一處隱蔽的房頂上張望藐俺。 院中可真熱鬧,春花似錦泥彤、人聲如沸欲芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菱父。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浙宜,已是汗流浹背官辽。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粟瞬,地道東北人同仆。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像裙品,于是被迫代替她去往敵國和親俗批。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容