c++ map初始化同时赋值_Golang入门教程——map篇
點(diǎn)擊上方藍(lán)字,和我一起學(xué)技術(shù)。
今天是golang專(zhuān)題的第7篇文章,我們來(lái)聊聊golang當(dāng)中map的用法。
map這個(gè)數(shù)據(jù)結(jié)構(gòu)我們經(jīng)常使用,存儲(chǔ)的是key-value的鍵值對(duì)。在C++/java當(dāng)中叫做map,在Python中叫做dict。這些數(shù)據(jù)結(jié)構(gòu)的名稱(chēng)雖然不盡相同,背后的技術(shù)支撐也不一定一樣,比如說(shuō)C++的map是紅黑樹(shù)實(shí)現(xiàn)的,Java中的hashmap則是通過(guò)hash表。但是使用起來(lái)的方法都差不多,除了Java是通過(guò)get方法獲取鍵值之外,C++、Python和golang都是通過(guò)方括號(hào)獲取的。
聲明與初始化
golang中的map聲明非常簡(jiǎn)單,我們用map關(guān)鍵字表示聲明一個(gè)map,然后在方括號(hào)內(nèi)填上key的類(lèi)型,方括號(hào)外填上value的類(lèi)型。
var?m?map[string]?int
這樣我們就聲明好了一個(gè)map。
但是要注意,這樣聲明得到的是一個(gè)空的map,map的零值是nil,可以理解成空指針。所以我們不能直接去操作這個(gè)m,否則會(huì)得到一個(gè)panic。
panic: assignment to entry in nil map
panic在golang當(dāng)中表示非常嚴(yán)重不可恢復(fù)的錯(cuò)誤,可以恢復(fù)的錯(cuò)誤有些類(lèi)似于Java或者是其他語(yǔ)言當(dāng)中的異常,當(dāng)異常出現(xiàn)的時(shí)候,我們可以選擇handle住它們,讓程序不崩潰繼續(xù)運(yùn)行。而那些非常嚴(yán)重,無(wú)法handle的異常在golang當(dāng)中稱(chēng)為panic。
golang當(dāng)中的異常處理機(jī)制和其他語(yǔ)言相差很大,整體的邏輯和內(nèi)核都不太一樣。當(dāng)然這個(gè)是一個(gè)比較大的話題,我們這里可以簡(jiǎn)單將它理解成error就行了。
回到map上來(lái),我們聲明了一個(gè)map之后,想要使用它還需要對(duì)它進(jìn)行初始化。使用它的方法也很簡(jiǎn)單,就是使用make方法創(chuàng)建出一個(gè)實(shí)例來(lái)。它的用法和之前通過(guò)make創(chuàng)建元組非常類(lèi)似:
m?=?make(map[string]?int)//?我們還可以指定創(chuàng)建出來(lái)的map的存儲(chǔ)能力的大小
m?=?make(map[string]?int,?100)
我們也可以在聲明的時(shí)候把初始化也寫(xiě)上:
var?m?=?map[string]?int?{"abc":?3,?"ccd":?4}
當(dāng)然也可以通過(guò)賦值運(yùn)算符,直接make出一個(gè)空的map來(lái):
m?:=?make(map[string]?int)
增刪改查
map創(chuàng)建好了當(dāng)然是要用的,整體使用起來(lái)和Python當(dāng)中的dict比較像,比較簡(jiǎn)單直觀,沒(méi)有太多彎彎繞的東西。我們一個(gè)一個(gè)來(lái)看,首先是map的添加元素。map的添加元素直接用方括號(hào)賦值即可:
m["abc"]?=?4
同樣,我們需要保證這里的m經(jīng)過(guò)初始化,否則也會(huì)包nil的panic。如果key值在map當(dāng)中已經(jīng)存在,那么會(huì)自動(dòng)替換掉原本的key。也就是說(shuō)map的更新和添加元素都是一樣的,都是通過(guò)這種方式。如果不存在就是添加,否則則是更新。
刪除元素也很簡(jiǎn)單,和Python當(dāng)中類(lèi)似,通過(guò)delete關(guān)鍵字刪除。
delete(m,?"abc")
當(dāng)我們刪除key的時(shí)候,如果是其他的語(yǔ)言,我們需要判斷這個(gè)key值是否存在,否則的話不能刪除,或者是會(huì)引起異常。在golang當(dāng)中并不會(huì),對(duì)這點(diǎn)做了優(yōu)化。如果要?jiǎng)h除的key值原本就不在map當(dāng)中,那么當(dāng)我們調(diào)用了delete之后,什么也不會(huì)發(fā)生。但是有一點(diǎn),必須要保證傳入的map不為nil,否則也會(huì)引起panic。
最后,我們看下元素的查找。對(duì)于Java和Python來(lái)說(shuō)我們都是通過(guò)一些判斷語(yǔ)句來(lái)進(jìn)行判斷的,比如java的話是containsKey,Python的話用in操作符。在golang當(dāng)中我們則是直接通過(guò)方括號(hào)進(jìn)行查詢(xún),那么這就有了一個(gè)問(wèn)題,如果key不在其中怎么辦?
如果是其他語(yǔ)言,我們直接訪問(wèn)一個(gè)不存在的key是會(huì)拋出異常的,但是在golang當(dāng)中不會(huì)觸發(fā)panic,因?yàn)樗鼤?huì)額外返回一個(gè)bool類(lèi)型的元素表示元素是否查找到。所以我們可以同時(shí)用兩個(gè)變量去接收,如果第二個(gè)變量為T(mén)rue的話,就說(shuō)明查找成功了。
進(jìn)一步,我們還可以將這個(gè)邏輯和if的初始化操作合在一起:
if?val,?ok?:=?m["1234"];?ok?{
????fmt.Println(val)
}
這里的ok就表示查找是否成功,這也是golang當(dāng)中map查找的慣用寫(xiě)法。
最后, 我們看一個(gè)實(shí)際運(yùn)用map的例子,通過(guò)map來(lái)生成統(tǒng)計(jì)字符串當(dāng)中單詞數(shù)量的wordCount:
package?mainimport?("golang.org/x/tour/wc""strings"
)func?WordCount(s?string)?map[string]int?{
?cnt?:=?make(map[string]int)//?通過(guò)Split方法拆分字符串for?_,?str:=?range?strings.Split(s){//?直接++即可,golang會(huì)自動(dòng)填充
??cnt[str]++
?}return?cnt
}func?main()?{
?wc.Test(WordCount)
}
總結(jié)
到這里,關(guān)于golang當(dāng)中map的使用就算是介紹完了。我們可以發(fā)現(xiàn),map一如既往地體現(xiàn)了golang語(yǔ)法精簡(jiǎn)的特點(diǎn)。比如通過(guò)返回error的操作省略了判斷元素是否存在map當(dāng)中的操作,剛開(kāi)始的時(shí)候會(huì)覺(jué)得有些不太適應(yīng),但是接觸多了之后,會(huì)發(fā)現(xiàn)這些都是有套路的。golang的套路就是精簡(jiǎn),能省就省,能簡(jiǎn)單絕不復(fù)雜。
這一點(diǎn)不僅在map上體現(xiàn),在其他特性上也是一樣。在后續(xù)的內(nèi)容當(dāng)中,我們還會(huì)繼續(xù)感知這一點(diǎn)。
如果喜歡本文,可以的話,請(qǐng)點(diǎn)個(gè)關(guān)注,給我一點(diǎn)鼓勵(lì),也方便獲取更多文章。
總結(jié)
以上是生活随笔為你收集整理的c++ map初始化同时赋值_Golang入门教程——map篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 设置窗口置顶_这三个应用,每一个都能让你
- 下一篇: mysql事务嵌套 php_使用以下代码
