Go 語(yǔ)言程序設(shè)計(jì)——集合類型(3)

映射

  • 映射(map)是一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu),保存鍵-值對(duì)的無(wú)序集合,它的容量只受到機(jī)器內(nèi)存的限制
  • 映射中所有的鍵都是唯一的而且必須支持 ==!= 操作符的類型
  • 大部分 Go 語(yǔ)言的基礎(chǔ)類型都可以作為映射的鍵,例如 intfloat64、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)的鍵被保存
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容