映射
- 映射(map)是一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu),保存鍵-值對(duì)的無(wú)序集合,它的容量只受到機(jī)器內(nèi)存的限制
- 映射中所有的鍵都是唯一的而且必須支持
==和!=操作符的類型 - 大部分 Go 語(yǔ)言的基礎(chǔ)類型都可以作為映射的鍵,例如
int、float64、rune、string、可比較的數(shù)組和結(jié)構(gòu)體、基于這些類型的自定義類型、指針 -
指針、引用類型或者任何內(nèi)置類型的值、自定義類型都可以做值,包括了映射本身,所以它可以創(chuàng)建任何復(fù)雜的數(shù)據(jù)結(jié)構(gòu) -
映射的操作:
映射的操作 - 映射是屬于引用類型,所以不管一個(gè)映射保存了多少的數(shù)據(jù),傳遞都是很廉價(jià)的
- 映射里所有鍵的數(shù)據(jù)類型必須是相同的,值也必須如此,但鍵和值的數(shù)據(jù)類型可以不同
-
make()函數(shù)可以創(chuàng)建切片、映射和通道,用make()來(lái)創(chuàng)建一個(gè)映射時(shí),得到的是一個(gè)空映射
創(chuàng)建和填充映射
- 對(duì)于一些小映射,我們沒(méi)必要考慮是否指定初始容量,如果映射比較大,指定恰當(dāng)?shù)娜萘靠梢蕴岣咝阅?/li>
- 映射和數(shù)組、切片一樣可以使用
[]索引操作符,當(dāng)不同的是,映射不必是int類型,可以為其他類型 - 映射里面的項(xiàng)是無(wú)序的,所以可能打印出來(lái)的順序和本書的不一樣
映射查詢
- 兩種方法用于映射查詢,兩種方式都是使用
[]操作符 - 第一種方式直接查詢,如果這個(gè)鍵并沒(méi)有在映射里,就會(huì)返回一個(gè)
0值(如果本身就存的0,就不知道是不是不存在) - 第二種方式可以指定兩個(gè)返回值,第一個(gè)用來(lái)獲得鍵對(duì)應(yīng)的值,第二個(gè)變量是布爾類型(鍵存在則為
true, 否則則為false)
修改映射
我們可以往映射里插入、刪除、修改一項(xiàng):
fmt.Println(len(populationForCity), populationForCity)
delete(populationForCity, "Shanghai") // 刪除
fmt.Println(len(populationForCity), populationForCity)
populationForCity["Karachi"] = 11620000 // 更新
fmt.Println(len(populationForCity), populationForCity)
populationForCity["Beijing"] = 11290000 // 插入
fmt.Println(len(populationForCity), populationForCity)
插入和更新一個(gè)項(xiàng)的語(yǔ)法是完全一樣的,如果沒(méi)有值,則設(shè)置為新的值
鍵序遍歷映射
思想為創(chuàng)建一個(gè)切片去保存映射里所有的鍵,然后對(duì)這個(gè)鍵的切片排序,遍歷后得到鍵,再?gòu)挠成淅锏玫芥I的值。
映射反轉(zhuǎn)
- 如果一個(gè)映射的值是唯一的,并且值的類型也是映射所支持的鍵類型的話,我們就能將它反轉(zhuǎn)
- 如果值不是唯一的,實(shí)質(zhì)上只有最后一個(gè)不唯一的值對(duì)應(yīng)的鍵被保存
