溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言中的數(shù)組與切片介紹

發(fā)布時(shí)間:2021-08-27 17:00:20 來源:億速云 閱讀:107 作者:chen 欄目:數(shù)據(jù)庫

這篇文章主要講解了“Go語言中的數(shù)組與切片介紹”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go語言中的數(shù)組與切片介紹”吧!

1. 數(shù)組

數(shù)組是一個(gè)由固定長度的特定類型元素組成的序列,一個(gè)數(shù)組可以由零個(gè)或多個(gè)元素組成。因?yàn)閿?shù)組的長度是固定的,所以在Go語言中很少直接使用數(shù)組。

聲明數(shù)組,并給該數(shù)組里的每個(gè)元素賦值(索引值的最小有效值和其他大多數(shù)語言一樣是 0,不是1)

//[3]里的3表示該數(shù)組的元素個(gè)數(shù) vararr[3]int arr[0]=1 arr[1]=2 arr[2]=3

聲明并直接初始化數(shù)組

//第一種方法 vararr[3]int=[3]int{1,2,3} //第二種方法 arr:=[3]int{1,2,3}

上面的 3 表示數(shù)組的元素個(gè)數(shù) ,萬一你哪天想往該數(shù)組中增加元素,你得對應(yīng)修改這個(gè)數(shù)字,為了避免這種硬編碼,你可以這樣寫,使用...讓Go語言自己根據(jù)實(shí)際情況來分配空間。

arr:=[...]int{1,2,3}

[3]int和[4]int雖然都是數(shù)組,但他們卻是不同的類型,使用 fmt 的%T可以查得,如果使用 == 來比較,答案會(huì)是false

import("fmt" ) funcmain(){arr01:=[...]int{1,2,3}arr02:=[...]int{1,2,3,4}fmt.Printf("%d的類型是:%T\n",arr01,arr01)fmt.Printf("%d的類型是:%T",arr02,arr02)}

輸出 如下

[1 2 3]的類型是:[3]int [1 2 3 4]的類型是:[4]int

如果你覺得每次寫[3]int有點(diǎn)麻煩,你可以為[3]int定義一個(gè)類型字面量,也就是別名類型。

使用type關(guān)鍵字可以定義一個(gè)類型字面量,后面只要你想定義一個(gè)容器大小為3,元素類型為int的數(shù)組 ,都可以使用這個(gè)別名類型。

import("fmt" ) funcmain(){typearr3[3]int myarr:=arr3{1,2,3}fmt.Printf("%d的類型是:%T",myarr,myarr)}

輸出 如下

[123]的類型是:main.arr3

2. 切片

切片(Slice)與數(shù)組一樣,也是可以容納若干類型相同的元素的容器。與數(shù)組不同的是,無法通過切片類型來確定其值的長度。每個(gè)切片值都會(huì)將數(shù)組作為其底層數(shù)據(jù)結(jié)構(gòu)。我們也把這樣的數(shù)組稱為切片的底層數(shù)組。

切片是對數(shù)組的一個(gè)連續(xù)片段的引用,所以切片是一個(gè)引用類型,這個(gè)片段可以是整個(gè)數(shù)組,也可以是由起始和終止索引標(biāo)識的一些項(xiàng)的子集,需要注意的是,終止索引標(biāo)識的項(xiàng)不包括在切片內(nèi)(意思是這是個(gè)左閉右開的區(qū)間)

import("fmt" ) funcmain(){myarr:=[...]int{1,2,3}fmt.Printf("%d的類型是:%T",myarr[0:2],myarr[0:2])}

輸出 如下

[1 2]的類型是:[]int

切片的構(gòu)造,有三種方式

    對數(shù)組進(jìn)行片段截?。ㄉ厦胬右呀?jīng)展示:myarr[0:2],0是索引起始值,2是索引終止值,區(qū)間左半右開)

    從頭聲明賦值(例子如下)

    //聲明字符串切片 varstrList[]string //聲明整型切片 varnumList[]int //聲明一個(gè)空切片 varnumListEmpty=[]int{}

    使用 make 函數(shù)構(gòu)造,make 函數(shù)的格式:make( []Type, size, cap )

    這個(gè)函數(shù)剛好指出了,一個(gè)切片具備的三個(gè)屬性:類型(Type),長度(size),容量(cap)

    import("fmt" ) funcmain(){a:=make([]int,2)b:=make([]int,2,10)fmt.Println(a,b)fmt.Println(len(a),len(b))fmt.Println(cap(a),cap(b))}

    輸出 如下

    [00][00] 22 210

關(guān)于 len 和 cap 的概念,可能不好理解 ,這里舉個(gè)例子:

公司名,就是變量名。公司里的所有工位,相當(dāng)于已分配到的內(nèi)存空間公司里的員工,相當(dāng)于元素。cap 代表你這個(gè)公司最多可以容納多少員工len 代表你這個(gè)公司當(dāng)前有多少個(gè)員工,所以cap>=len

由于 切片是引用類型,所以你不對它進(jìn)行賦值的話,它的零值(默認(rèn)值)是 nil

varmyarr[]int fmt.Println(myarr==nil) //true

數(shù)組 與 切片 有相同點(diǎn),它們都是可以容納若干類型相同的元素的容器

也有不同點(diǎn),數(shù)組的容器大小固定,而切片本身是引用類型,它更像是 Python 中的 list ,我們可以對它 append 進(jìn)行元素的添加。

import("fmt" ) funcmain(){myarr:=[]int{1}//追加一個(gè)元素 myarr=append(myarr,2)//追加多個(gè)元素 myarr=append(myarr,3,4)//追加一個(gè)切片,...表示解包,不能省略 myarr=append(myarr,[]int{7,8}...)//在第一個(gè)位置插入元素 myarr=append([]int{0},myarr...)//在中間插入一個(gè)切片(兩個(gè)元素) myarr=append(myarr[:5],append([]int{5,6},myarr[5:]...)...)fmt.Println(myarr)}

輸出 如下

[012345678]

最后,給你留一道思考題,如下這段代碼:

import("fmt" ) funcmain(){varnumbers4=[...]int{1,2,3,4,5,6,7,8,9,10}myslice:=numbers4[4:6:8]fmt.Printf("myslice為%d,其長度為:%d\n",myslice,len(myslice))myslice=myslice[:cap(myslice)]fmt.Printf("myslice的第四個(gè)元素為:%d",myslice[3])}

為什么 myslice 的長度為2,卻能訪問到第四個(gè)元素?

myslice為[56],其長度為:2 myslice的第四個(gè)元素為:8

感謝各位的閱讀,以上就是“Go語言中的數(shù)組與切片介紹”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Go語言中的數(shù)組與切片介紹這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI