淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用_第1頁(yè)
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用_第2頁(yè)
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用_第3頁(yè)
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用_第4頁(yè)
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論