數(shù)組:
語(yǔ)法:
//value := [數(shù)據(jù)長(zhǎng)度]類(lèi)型 {}
arr := [1]string{"1"}// 聲明并且賦值
arr = [1]string{}// 聲明未賦值
arr[0]="1"
數(shù)組類(lèi)型的值(以下簡(jiǎn)稱(chēng)數(shù)組)的長(zhǎng)度是固定的數(shù)組的長(zhǎng)度在聲明它的時(shí)候就必須給定啄糙,并且在之后不會(huì)再改變急侥。可以說(shuō),數(shù)組的長(zhǎng)度是其類(lèi)型的一部分(數(shù)組的容量永遠(yuǎn)等于其長(zhǎng)度纸颜,都是不可變的)
切片:
語(yǔ)法:
//value := []類(lèi)型 {}
// 創(chuàng)建長(zhǎng)度容量都為0的切片
value :=[]string{}// []string{"1"} 長(zhǎng)度容量為1的切片
value :=append(value,"1")
//數(shù)據(jù)轉(zhuǎn)切片
arr := [1]string{"1"}
slice :=arr[:]
// 創(chuàng)建長(zhǎng)度容量為1的切片
slice = make([]string, 1)
// 創(chuàng)建長(zhǎng)度為1,容量為2的切片
slice = make([]string, 1永脓,2)
切片類(lèi)型的值是可變長(zhǎng)的泥技。而切片的類(lèi)型字面量中只有其元素的類(lèi)型,而沒(méi)有其長(zhǎng)度颓哮。切片的長(zhǎng)度可以自動(dòng)地隨著其中元素?cái)?shù)量的增長(zhǎng)而增長(zhǎng)家妆,但不會(huì)隨著元素?cái)?shù)量的減少而減少。
在每一個(gè)切片的底層數(shù)據(jù)結(jié)構(gòu)中冕茅,會(huì)包含一個(gè)數(shù)組伤极,可以被叫做底層數(shù)據(jù),而切片就是對(duì)底層數(shù)組的引用姨伤,故而切片類(lèi)型屬于引用類(lèi)型
切片理解
底層數(shù)據(jù)類(lèi)似一個(gè)窗戶(hù)哨坪,窗戶(hù)的寬度就類(lèi)似與底層數(shù)據(jù)的長(zhǎng)度,而切片就是窗口(該窗口只能往一個(gè)方向移動(dòng))乍楚,可以通過(guò)該窗口看到一個(gè)數(shù)組当编,但不一定能看到該數(shù)組中所有的元素,有時(shí)候只能看待連續(xù)的一部分元素
代碼:
/*
// 切片的結(jié)構(gòu)體
type slice struct {
array unsafe.Pointer // 底層數(shù)據(jù)的指針
len int // 切的長(zhǎng)度
cap int // 截取底層數(shù)據(jù)的容量
}
*/
arr := [8]int{1, 2, 3, 4, 5, 6, 7, 8}//定義一個(gè)數(shù)組徒溪,作為底層數(shù)組
/*
進(jìn)行切片操作忿偷,將 索引為3開(kāi)始到后面的元素截取出來(lái)
sli := slice{
array: unsafe.Pointer(&arr),
len: 6 - 3,
cap: cap(arr) - 3,
}
sli容量 表示arr中的 { 4, 5, 6, 7, 8}這部分元素
sli:表示arr中的 {4,5臊泌,6}鲤桥,因?yàn)殚L(zhǎng)度是3 就取容量表示的三個(gè)元素
*/
sli := arr[3:6]
fmt.Printf("slice: %d\n", sli)//slice: [4 5 6
/*
再進(jìn)行切片操作的時(shí)候,
sli[:cap(sli)]
slitemp := slice{
array: unsafe.Pointer(&sli),
len: cap(sli) - 0, // 5 -0
cap: cap(arr) - 0,// 5-0
}
slitemp: 表示arr中的 { 4, 5, 6, 7, 8}這部分元素
*/
fmt.Printf("slice: %d\n", sli[:cap(sli)])//slice: [4 5 6 7 8]
共同點(diǎn):
都屬于集合類(lèi)的類(lèi)型渠概,它們的值也都可以用來(lái)存儲(chǔ)某一種類(lèi)型的值(或者說(shuō)元
素)茶凳。
擴(kuò)展:
一個(gè)切片無(wú)法容納更多的元素,Go 語(yǔ)言就會(huì)想辦法擴(kuò)容。但它并不會(huì)改變?cè)瓉?lái)的切片慧妄,而
是會(huì)生成一個(gè)容量更大的切片顷牌,然后將把原有的元素和新元素一并拷貝到新切片中。
在一般的情況下塞淹,你可以簡(jiǎn)單地認(rèn)為新切片的容量(以下簡(jiǎn)稱(chēng)新容量)將會(huì)是原切片容量(以下
簡(jiǎn)稱(chēng)原容量)的 2 倍窟蓝。
但是,當(dāng)原切片的長(zhǎng)度(以下簡(jiǎn)稱(chēng)原長(zhǎng)度)大于或等于1024時(shí)饱普,Go 語(yǔ)言將會(huì)以原容量的1.25
倍作為新容量的基準(zhǔn)(以下新容量基準(zhǔn))运挫。
新容量基準(zhǔn)會(huì)被調(diào)整(不斷地與1.25相乘),直到結(jié)果不小于原長(zhǎng)度與要追加的元素?cái)?shù)量之和
(以下簡(jiǎn)稱(chēng)新長(zhǎng)度)套耕。
只要新長(zhǎng)度不會(huì)超過(guò)切片的原容量谁帕,那么使用append函數(shù)對(duì)其追加元素的時(shí)候就
不會(huì)引起擴(kuò)容。這只會(huì)使緊鄰切片窗口右邊的(底層數(shù)組中的)元素被新的元素替換掉冯袍。