這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一、切片的定義
我們可以從數組或者切片來初始化一個新的切片,也可以直接通過 make 來初始化一個所有元素為預設零值的切片。
//1、通過數組來初始化切片 arr := [...]int{1, 2, 3, 4, 5} slice1 := arr[:] // [1,2,3,4,5] slice2 := arr[2:4] // [3,4] slice3 := arr[:4] // [1,2,3,4] slice4 := arr[2:] // [3,4,5] //2、通過切片來初始化切片 slice5 := slice1[3:] //[4,5] //3、直接初始化。可以通過 make 來初始化,格式為 make([]int, len, cap),所有的元素初始化為預設零值;也可以直接初始化。 slice6 := make([]int, 3, 6) // [0,0,0] slice7 := []int{1, 2, 3, 4, 5} // [1,2,3,4,5]
二、切片的特點
slice 有點類似 C++ 中的 vector,都是可變長數組,有容量的概念,但是也有很多不同,如 slice 是基於數組的(該數組稱為底級數組),slice 的長度是從底級數組中取出來的元素個數,容量是底級數組的最大索引與取出元素的最小索引的差值。array 是實值型別,但 slice 卻是參考型別。
func func1(s []int) { s[0] *= 10 //會修改原切片的值}func func2(s []int) { for _, v := range s { //不會修改原切片的值,因 for ... range 是唯讀 v *= 10 }}func func3(s []int) { for i := 0; i < len(s); i++ { //會修改原切片的值 s[i] *= 10 }}func main() { s := []int{1, 2, 3, 4, 5} //func1(s) // 10,2,3,4,5, //func2(s) //1,2,3,4,5, //func3(s) //10,20,30,40,50, for _, v := range s { println(v, ",") }}
三、切片的操作
切片的操作比數組複雜一些,因為切片是可變長的,而且有容量的概念。當切片容量不夠時,它會以2倍率來擴張。
1、擷取切片長度:len(slice)
2、擷取切片容量:cap(slice)
3、為切片追加元素:slicename = append(slicename, element1, element2,...)
該函數是可變參函數,可變參部分也可傳入另一個切片,形式為 slicename = append(slicename, slicename2...) ,可以參考可變參函數的用法。其實之前我一直疑惑為什麼要再賦值給原切片,其實是因為,但append函數調用時,如果切片容量不夠的話,會建立一個新的切片變數,這應該也就是為什麼要賦值給原切片的原因吧。
4、切片沒有提供刪除元素的方法,但可以通過擷取子切片的方式來達成此目的,但無法直接的從中間刪除元素;也不能從中間插入元素。
5、切片的複製: copy(slice1, slice2)
如果傳入的索引位置 大於等於切片的長度,則