Golang(五) Map

集合(Map)

什么是Map

map是Go中的內(nèi)置類型,它將一個值與一個鍵關(guān)聯(lián)起來。可以使用相應(yīng)的鍵檢索值袁辈。

Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索數(shù)據(jù)珠漂,key 類似于索引晚缩,指向數(shù)據(jù)的值 Map 是一種集合尾膊,所以我們可以像迭代數(shù)組和切片那樣迭代它。不過荞彼,Map 是無序的冈敛,我們無法決定它的返回順序,這是因為 Map 是使用 hash 表來實現(xiàn)的鸣皂,也是引用類型

使用map過程中需要注意的幾點:

  • map是無序的抓谴,每次打印出來的map都會不一樣,它不能通過index獲取寞缝,而必須通過key獲取
  • map的長度是不固定的癌压,也就是和slice一樣,也是一種引用類型
  • 內(nèi)置的len函數(shù)同樣適用于map荆陆,返回map擁有的key的數(shù)量
  • map的key可以是所有可比較的類型滩届,如布爾型、整數(shù)型慎宾、浮點型丐吓、復(fù)雜型浅悉、字符串型

Map的使用

使用make()創(chuàng)建map

可以使用內(nèi)建函數(shù) make 也可以使用 map 關(guān)鍵字來定義 Map:

/* 聲明變量趟据,默認 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函數(shù) */
map_variable = make(map[key_data_type]value_data_type)
rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }

如果不初始化 map,那么就會創(chuàng)建一個 nil map术健。nil map 不能用來存放鍵值對

package main

import "fmt"

func main() {
   var countryCapitalMap map[string]string
   /* 創(chuàng)建集合 */
   countryCapitalMap = make(map[string]string)

   /* map 插入 key-value 對汹碱,各個國家對應(yīng)的首都 */
   countryCapitalMap["France"] = "Paris"
   countryCapitalMap["Italy"] = "Rome"
   countryCapitalMap["Japan"] = "Tokyo"
   countryCapitalMap["India"] = "New Delhi"

   /* 使用 key 輸出 map 值 */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }

   /* 查看元素在集合中是否存在 */
   captial, ok := countryCapitalMap["United States"]
   /* 如果 ok 是 true, 則存在,否則不存在 */
   if(ok){
      fmt.Println("Capital of United States is", captial)
   }else {
      fmt.Println("Capital of United States is not present")
   }
}

結(jié)果

Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
Capital of United States is not present

delete() 函數(shù)

delete(map, key) 函數(shù)用于刪除集合的元素, 參數(shù)為 map 和其對應(yīng)的 key荞估。刪除函數(shù)不返回任何值咳促。

package main

import "fmt"

func main() {
   /* 創(chuàng)建 map */
   countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}

   fmt.Println("原始 map")

   /* 打印 map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }

   /* 刪除元素 */
   delete(countryCapitalMap,"France");
   fmt.Println("Entry for France is deleted")

   fmt.Println("刪除元素后 map")

   /* 打印 map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
}

結(jié)果

原始 map
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
Entry for France is deleted
刪除元素后 map
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi

ok-idiom

我們可以通過key獲取map中對應(yīng)的value值。語法為:

map[key]

但是當key如果不存在的時候勘伺,我們會得到該value值類型的默認值跪腹,比如string類型得到空字符串,int類型得到0飞醉。但是程序不會報錯冲茸。

所以我們可以使用ok-idiom獲取值,可知道key/value是否存在

value, ok := map[key]

示例代碼:

package main

import (
    "fmt"
)

func main() {
    m := make(map[string]int)
    m["a"] = 1
    x, ok := m["b"]
    fmt.Println(x, ok)
    x, ok = m["a"]
    fmt.Println(x, ok)
}

結(jié)果

0 false
1 true

map的長度

使用len函數(shù)可以確定map的長度缅帘。

len(map)  // 可以得到map的長度

map是引用類型的

與切片相似轴术,映射是引用類型。當將映射分配給一個新變量時钦无,它們都指向相同的內(nèi)部數(shù)據(jù)結(jié)構(gòu)逗栽。因此,一個的變化會反映另一個失暂。

示例代碼:

package main

import (
    "fmt"
)

func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("Original person salary", personSalary)
    newPersonSalary := personSalary
    newPersonSalary["mike"] = 18000
    fmt.Println("Person salary changed", personSalary)
}

運行結(jié)果:

Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]

map不能使用==操作符進行比較彼宠。==只能用來檢查map是否為空鳄虱。否則會報錯:invalid operation: map1 == map2 (map can only be comparedto nil)

make、new操作

make用于內(nèi)建類型(map凭峡、slice 和channel)的內(nèi)存分配醇蝴。new用于各種類型的內(nèi)存分配 內(nèi)建函數(shù)new本質(zhì)上說跟其它語言中的同名函數(shù)功能一樣:new(T)分配了零值填充的T類型的內(nèi)存空間,并且返回其地址想罕,即一個*T類型的值悠栓。用Go的術(shù)語說,它返回了一個指針按价,指向新分配的類型T的零值惭适。有一點非常重要: new返回指針

內(nèi)建函數(shù)make(T, args)與new(T)有著不同的功能,make只能創(chuàng)建slice楼镐、map和channel癞志,并且返回一個有初 始值(非零)的T類型,而不是*T框产。本質(zhì)來講凄杯,導(dǎo)致這三個類型有所不同的原因是指向數(shù)據(jù)結(jié)構(gòu)的引用在使用前必須被初始化。例如秉宿,一個slice戒突,是一個包含指向數(shù)據(jù)(內(nèi)部array)的指針、長度和容量的三項描述符描睦;在這些項目被初始化之前膊存,slice為nil。對于slice忱叭、map和channel來說隔崎,make初始化了內(nèi)部的數(shù)據(jù)結(jié)構(gòu),填充適當?shù)闹怠?/p>

make返回初始化后的(非零)值韵丑。

原文:第5章-Map
作者:黎躍春

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爵卒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撵彻,更是在濱河造成了極大的恐慌钓株,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千康,死亡現(xiàn)場離奇詭異享幽,居然都是意外死亡,警方通過查閱死者的電腦和手機拾弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門值桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豪椿,你說我怎么就攤上這事奔坟⌒埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵咳秉,是天一觀的道長婉支。 經(jīng)常有香客問我,道長澜建,這世上最難降的妖魔是什么向挖? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮炕舵,結(jié)果婚禮上何之,老公的妹妹穿的比我還像新娘。我一直安慰自己咽筋,他們只是感情好溶推,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奸攻,像睡著了一般蒜危。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睹耐,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天辐赞,我揣著相機與錄音,去河邊找鬼疏橄。 笑死占拍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的捎迫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼表牢,長吁一口氣:“原來是場噩夢啊……” “哼窄绒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崔兴,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤彰导,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后敲茄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體位谋,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年堰燎,在試婚紗的時候發(fā)現(xiàn)自己被綠了掏父。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秆剪,死狀恐怖赊淑,靈堂內(nèi)的尸體忽然破棺而出爵政,到底是詐尸還是另有隱情,我是刑警寧澤陶缺,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布钾挟,位于F島的核電站,受9級特大地震影響饱岸,放射性物質(zhì)發(fā)生泄漏掺出。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一苫费、第九天 我趴在偏房一處隱蔽的房頂上張望蛛砰。 院中可真熱鬧,春花似錦黍衙、人聲如沸泥畅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽位仁。三九已至,卻和暖如春方椎,著一層夾襖步出監(jiān)牢的瞬間聂抢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工棠众, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琳疏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓闸拿,卻偏偏與公主長得像空盼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子新荤,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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