golang中,slice的幾個易混淆點

2022-01-22 01:45:49 字數 2029 閱讀 2509

slice在golang中是最常用的型別,一般可以把它作為陣列使用,但是比陣列要高效呀。不過,我感覺這個東西用的不好坑太多了。還是需要了解下他底層的實現

type slice struct
看結構定義,就三個字段,那個指標指向的就是底層陣列,所以說slice的底層結構就是陣列。

第一種方式

var s int #和陣列差不多,中間不要數字

第二種方式

s :=int{}

第三種方式

s :=make(int,len,cap)

len 表示元素的實際數量

cap 表示可以容納元素的最大個數

以上三種定義是有區別的,第一種定義的s值為nil slice,其它兩種為empty slice.要編碼時要加以區分

如果slice容量足夠容納新增的元素,那麼不會擴容。

如果新增元素後容量不足,則會擴容為原容量的 2 倍大小,如果原 slice 容量大於1024,那擴容後的容量等於每次擴容前增加 1/4。同時將原來的資料拷貝到新的陣列中,所以還是要合理使用擴容。

一、slice作引數傳遞

slice作引數傳遞時,雖然是值傳遞(拷貝乙份),但是slice的內部指標,指向的還是同乙個陣列是引用,所以會有影響。

func main() 

fmt.println("原始s的值",s)

changeslice(s)

fmt.println("s被改變後的值", s)

}func changeslice(s int)

輸出:原始s的值 [1 2 3 4]

changeslice後的s值 [7 8 3 4]

s被改變後的值 [7 8 3 4]

func main() 

fmt.println("原始s的值",s)

changeslice(s)

fmt.println("s被改變後的值", s)

}func changeslice(s int)

輸出:原始s的值 [1 2 3]

changeslice後的s值 [1 999 3 777]

s被改變後的值 [1 999 3]

func main() 

fmt.println("原始s的值",s)

changeslice(s)

fmt.println("s被改變後的值", s)

}func changeslice(s int)

輸出:原始s的值 [1 2 3]

changeslice後的s值 [1 999 3 777 888]

s被改變後的值 [1 2 3]

從slice切割生成的slice,其實還是指向的同乙個底層陣列,一方有改動,還是會影響到對方。

var s int

s = int

fmt.println("原始的s的值", s)

s2 :=s[1:5]

fmt.println("切割後的:s2", s2)

s2[0] = 99

fmt.println("s2重新賦值:",s2)

fmt.println("s的值:", s)

s3 :=s2[0:2]

fmt.println("s3的值", s3)

s3[1] = 99999

fmt.println("s2的值",s2)

fmt.println("s的值",s)

輸出:原始的s的值 [1 2 3 4 5 6]

切割後的:s2 [2 3 4 5]

s2重新賦值: [99 3 4 5]

s的值: [1 99 3 4 5 6]

s3的值 [99 3]

s2的值 [99 99999 4 5]

s的值 [1 99 99999 4 5 6]

平時使用slice時,還是要小心點,主要注意有無擴容這塊。不然就會產生很多不可想像的問題了。

golang中slice的擴容機制

在golang中slice是乙個指向陣列的指標結構體。這個結構體有三個屬性 其概念為 動態陣列 及陣列的容量大小 cap 會隨著陣列的實際大小 size 變化而變化 擴容 擴容機制 如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2 一旦元素個數超過1024個元素,則乘...

golang中的空slice案例

package main func main 執行成功 補充 golang slice 詳解 func main var slice array 1 7 array startindex endindex 不包含endindex 2.直接建立陣列切片 slice2 make int,5,10 3.直...

Golang中的Slice自動擴容機制

剛剛寫了乙個api用到了golang的slice,想著用slice這麼久了竟然不知道這到底是個什麼東西。只知道slice和常規陣列相比是可自動變長的,內部到底是怎麼實現的呢?於是今天就和同事一起研究了一下golang中slice的自動擴容機制,這裡採用的是golang1.12版本。閒話少說,直接開整...