




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用目錄序列容器數(shù)組VectorDequeList單鏈表總結(jié)在Java的核心庫(kù)中,集合框架可謂鼎鼎大名:Array、List、Set、Queue、HashMap等等,隨便拎一個(gè)出來(lái)都值得開(kāi)發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼(這類(lèi)文章也挺多,大家上網(wǎng)隨便一搜)。
雖然Go語(yǔ)言沒(méi)有如此豐富的容器類(lèi)型,但也有一些基本的容器供開(kāi)發(fā)者使用,接下來(lái)讓我們一一認(rèn)識(shí)這些容器類(lèi)型吧。
序列容器
序列容器存儲(chǔ)特定類(lèi)型的數(shù)據(jù)元素。目前有5種序列容器的實(shí)現(xiàn):
arrayvectordequelistforward_list
這些序列容易可以用順序的方式保存數(shù)據(jù),利用這些序列容易能夠編寫(xiě)有效的代碼,重復(fù)使用標(biāo)準(zhǔn)庫(kù)的模塊化。
數(shù)組
Go語(yǔ)言中的數(shù)組類(lèi)型有點(diǎn)類(lèi)似C++中的數(shù)據(jù),Go的數(shù)組初始化定義后,在編譯時(shí)就不會(huì)再變更。
定義數(shù)組的方式如下:
vara[10]int
b:=[5]string{"H","e","l","l","o"}
[n]T類(lèi)型就表示含有n個(gè)類(lèi)型為T(mén)的數(shù)組,本例中就是a變量表示含有10個(gè)int類(lèi)型的整型數(shù)組;b變量表示含有5個(gè)string類(lèi)型的字符串?dāng)?shù)組。數(shù)組的長(zhǎng)度作為其類(lèi)型的一部分,因此數(shù)組的長(zhǎng)度是無(wú)法調(diào)整的。
packagemain
import"fmt"
funcmain(){
vara[10]int
a[0]=2025
a[1]=2025
fmt.Println(a[0],a[1])
fmt.Println(a)
b:=[5]string{"H","e","l","l","o"}
fmt.Println(b)
}
運(yùn)行結(jié)果如下:
Vector
你可能會(huì)好奇,Go語(yǔ)言又沒(méi)有C++中的Vector類(lèi)型,為什么會(huì)舉出這個(gè)例子。
其實(shí)Go最初有一個(gè)Vector類(lèi)型的實(shí)現(xiàn),但在2011年10月11日,在Go語(yǔ)言的開(kāi)發(fā)階段被刪除了。保留了現(xiàn)在的切片,而切片就變成了實(shí)際上更好的Vector實(shí)現(xiàn)。
一個(gè)數(shù)組有固定的大小,但切片是一個(gè)動(dòng)態(tài)、靈活的數(shù)組元素的視圖,在實(shí)際中,切片比數(shù)組更為常見(jiàn)。
[]T表示是一個(gè)具有類(lèi)型T的元素切片,[]byte是byteslice,指元素為byte的slice;[]string是stringslice,指元素為string的slice。
切片通過(guò)指定兩個(gè)切點(diǎn)a[low:high],可以定義如下的sliceExample切片:
sliceExample:=[]string{"Say","Hello","to","you"}
切片對(duì)比數(shù)組的最大優(yōu)點(diǎn)就是:可以隨著增加和刪除來(lái)增加或減少容器的大小。我們來(lái)看一個(gè)例子:
packagemain
import"fmt"
//removeiindexediteminaslice
funcremove(s[]string,iint)[]string{
copy(s[i:],s[i+1:])
returns[:len(s)-1]
funcmain(){
primes:=[6]int{2,3,5,7,11,13}
vars[]int=primes[1:4]
fmt.Println(s)
sliceExample:=[]string{"Say","Hello","to","you"}
sliceExample=append(sliceExample,",MyGopherFriends~")
fmt.Println("AppendSlice:",sliceExample)
sliceExample=remove(sliceExample,0)
fmt.Println("AfterRemovedItem:",sliceExample)
運(yùn)行結(jié)果如下圖:
我們分享了Go語(yǔ)言提供的容器中的數(shù)組和切片,不管是數(shù)據(jù)還是切片,它們內(nèi)部的數(shù)據(jù)類(lèi)型必須是一致的(要么都是整型、要么都是字符串類(lèi)型)。但數(shù)據(jù)的大小是固定,而切片可以根據(jù)元素的添加和減少動(dòng)態(tài)調(diào)整容器大小。
Deque
Deque,即雙端隊(duì)列,是一個(gè)可以擴(kuò)展的容器。擴(kuò)展可以發(fā)生在容器的前面或后面。當(dāng)隊(duì)列的頂部或尾部需要經(jīng)常被引用時(shí),經(jīng)常使用雙端隊(duì)列。
Go官網(wǎng)有一個(gè)雙端隊(duì)列的實(shí)現(xiàn),官方地址點(diǎn)此處。
下面的代碼塊顯示了Go雙端隊(duì)列deque的使用:
packagemain
import(
"fmt"
"/gammazero/deque"
funcmain(){
varqdeque.Deque[string]
q.PushBack("I")
q.PushBack("love")
q.PushBack("learning")
q.PushBack("Go")
fmt.Println("隊(duì)列長(zhǎng)度為:",q.Len())//Prints:4
fmt.Println("隊(duì)首為元素:",q.Front())//Prints:I
fmt.Println("隊(duì)尾為元素:",q.Back())//Prints:Go
q.PopFront()//remove"I"
q.PopBack()//remove"Go"
q.PushFront("Hello")
q.PushBack("World")
//Consumedequeandprintelements.
forq.Len()!=0{
fmt.Println(q.PopFront())
}
運(yùn)行結(jié)果如圖:
List
List在Go語(yǔ)言中有一個(gè)雙鏈表的實(shí)現(xiàn),它位于內(nèi)置標(biāo)準(zhǔn)庫(kù)container/list包中,官網(wǎng)地址為:https://pkg.go.dev/container/list
我們可以直接使用這個(gè)鏈表的實(shí)現(xiàn):
packagemain
import(
"container/list"
"fmt"
funcmain(){
//Createanewlistandputsomenumbersinit.
l1:=list.New()
e4:=l1.PushBack(4)
e1:=l1.PushFront(1)
l1.InsertBefore(3,e4)
l1.InsertAfter(2,e1)//nowl1is[1234]
//Iteratethroughlistandprintitscontents.
fore:=l1.Front();e!=nil;e=e.Next(){
fmt.Println(e.Value)
l1.MoveToBack(e1)//nowl1is[4231]
listLength:=l1.Len()//lengthis4
fmt.Printf("l1type:%T\n",l1)
fmt.Println("l1length::",listLength)
fore:=l1.Front();e!=nil;e=e.Next(){
fmt.Println(e.Value)
}
運(yùn)行結(jié)果為:
1
2
3
4
l1type:*list.List
l1length::4
2
3
4
1
單鏈表
最后介紹一下單鏈表,如果我們想實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)并沒(méi)有標(biāo)準(zhǔn)的容器集成,此時(shí)我們就可以通過(guò)自己根據(jù)要求來(lái)寫(xiě)一個(gè)自己想要的容器類(lèi)型,這里以頭插法的單鏈表舉例:
packagemain
import"fmt"
typeSinglyLinkedListstruct{
head*LinkedListNode
typeLinkedListNodestruct{
datastring
next*LinkedListNode
func(ll*SinglyLinkedList)Append(node*LinkedListNode){
ifll.head==nil{
ll.head=node
return
currentNode:=ll.head
forcurrentNode.next!=nil{
currentNode=currentNode.next
currentNode.next=node
funcmain(){
ll:=SinglyLinkedList{}
ll.Append(LinkedListNode{data:"Hello"})
ll.Append(LinkedListNode{data:"Gopher"})
fore:=ll.head;e!=nil;e=e.next{
fmt.Println(e.data)
}
運(yùn)行結(jié)果
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 健身課程合同范例
- 二手房委托買(mǎi)房合同范例
- 公司股分配合同范例
- 企業(yè)內(nèi)部如何應(yīng)用區(qū)塊鏈進(jìn)行消費(fèi)權(quán)益保護(hù)
- 2025年小學(xué)民主評(píng)議政風(fēng)行風(fēng)工作總結(jié)模版
- 買(mǎi)賣(mài)膠帶分裝合同范例
- 腰疝的臨床護(hù)理
- 專(zhuān)利獨(dú)占合同范例
- 溫州市普通高中2025屆高三第三次適應(yīng)性考試化學(xué)試題及答案
- 做衛(wèi)生間隔斷合同范例
- 2025年山東省青島市市南區(qū)中考一模地理試題(含答案)
- 102解二元一次方程組【10個(gè)必考點(diǎn)】(必考點(diǎn)分類(lèi)集訓(xùn))(人教版2024)
- 鄰水現(xiàn)代農(nóng)業(yè)發(fā)展集團(tuán)有限公司招聘筆試題庫(kù)2025
- 檔案管理員工作
- 兒童支氣管哮喘診斷與防治指南解讀(2025年)課件
- 腫瘤專(zhuān)科進(jìn)修匯報(bào)護(hù)理
- 第2課 《 手繪線條圖像-物象的多視角表達(dá)》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年人美版初中美術(shù)八年級(jí)下冊(cè)
- 腎上腺皮質(zhì)功能減退護(hù)理
- 配電房防火安全施工技術(shù)措施
- 地鐵乘客滿(mǎn)意度影響因素組態(tài)效應(yīng)分析:出行鏈視角研究
- 數(shù)學(xué)三角形的高、中線、角平分線教案2024-2025學(xué)年北師大版(2024)七年級(jí)數(shù)學(xué)下冊(cè)
評(píng)論
0/150
提交評(píng)論