版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第淺析Go語言容器之?dāng)?shù)組和切片的使用目錄序列容器數(shù)組VectorDequeList單鏈表總結(jié)在Java的核心庫中,集合框架可謂鼎鼎大名:Array、List、Set、Queue、HashMap等等,隨便拎一個(gè)出來都值得開發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼(這類文章也挺多,大家上網(wǎng)隨便一搜)。
雖然Go語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們一一認(rèn)識這些容器類型吧。
序列容器
序列容器存儲特定類型的數(shù)據(jù)元素。目前有5種序列容器的實(shí)現(xiàn):
arrayvectordequelistforward_list
這些序列容易可以用順序的方式保存數(shù)據(jù),利用這些序列容易能夠編寫有效的代碼,重復(fù)使用標(biāo)準(zhǔn)庫的模塊化。
數(shù)組
Go語言中的數(shù)組類型有點(diǎn)類似C++中的數(shù)據(jù),Go的數(shù)組初始化定義后,在編譯時(shí)就不會再變更。
定義數(shù)組的方式如下:
vara[10]int
b:=[5]string{"H","e","l","l","o"}
[n]T類型就表示含有n個(gè)類型為T的數(shù)組,本例中就是a變量表示含有10個(gè)int類型的整型數(shù)組;b變量表示含有5個(gè)string類型的字符串?dāng)?shù)組。數(shù)組的長度作為其類型的一部分,因此數(shù)組的長度是無法調(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
你可能會好奇,Go語言又沒有C++中的Vector類型,為什么會舉出這個(gè)例子。
其實(shí)Go最初有一個(gè)Vector類型的實(shí)現(xiàn),但在2011年10月11日,在Go語言的開發(fā)階段被刪除了。保留了現(xiàn)在的切片,而切片就變成了實(shí)際上更好的Vector實(shí)現(xiàn)。
一個(gè)數(shù)組有固定的大小,但切片是一個(gè)動態(tài)、靈活的數(shù)組元素的視圖,在實(shí)際中,切片比數(shù)組更為常見。
[]T表示是一個(gè)具有類型T的元素切片,[]byte是byteslice,指元素為byte的slice;[]string是stringslice,指元素為string的slice。
切片通過指定兩個(gè)切點(diǎn)a[low:high],可以定義如下的sliceExample切片:
sliceExample:=[]string{"Say","Hello","to","you"}
切片對比數(shù)組的最大優(yōu)點(diǎn)就是:可以隨著增加和刪除來增加或減少容器的大小。我們來看一個(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語言提供的容器中的數(shù)組和切片,不管是數(shù)據(jù)還是切片,它們內(nèi)部的數(shù)據(jù)類型必須是一致的(要么都是整型、要么都是字符串類型)。但數(shù)據(jù)的大小是固定,而切片可以根據(jù)元素的添加和減少動態(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ì)列長度為:",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語言中有一個(gè)雙鏈表的實(shí)現(xiàn),它位于內(nèi)置標(biāo)準(zhǔn)庫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)并沒有標(biāo)準(zhǔn)的容器集成,此時(shí)我們就可以通過自己根據(jù)要求來寫一個(gè)自己想要的容器類型,這里以頭插法的單鏈表舉例:
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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 充填回收工安全規(guī)程競賽考核試卷含答案
- 硅油及乳液生產(chǎn)工安全應(yīng)急強(qiáng)化考核試卷含答案
- 油脂及脂肪酸加氫操作工安全理論評優(yōu)考核試卷含答案
- 玻璃制品機(jī)械成型工班組考核強(qiáng)化考核試卷含答案
- 中藥灸熨劑工崗前安全知識競賽考核試卷含答案
- 薄膜電阻器制造工崗前技術(shù)規(guī)范考核試卷含答案
- 九年級開學(xué)第一課主題班會課件
- 安全文明施工保證措施
- 交通應(yīng)急預(yù)案制定與演練制度
- 吊車保險(xiǎn)培訓(xùn)課件大全
- 化工工藝安全管理與操作手冊
- 規(guī)范外匯交易管理制度
- 2026年美麗中國全國國家版圖知識競賽考試題庫(含答案)
- 高考英語讀后續(xù)寫技巧總結(jié)
- 2025年下半年河南鄭州市住房保障和房地產(chǎn)管理局招聘22名派遣制工作人員重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 維修事故協(xié)議書
- 2025ESC+EAS血脂管理指南要點(diǎn)解讀課件
- 2025至2030外周靜脈血栓切除裝置行業(yè)調(diào)研及市場前景預(yù)測評估報(bào)告
- 矛盾糾紛排查化解課件
- 2026年人力資源共享服務(wù)中心建設(shè)方案
- JJG(交通) 141-2017 瀝青路面無核密度儀
評論
0/150
提交評論