切片定義
- Go 語言切片是對陣列的抽象。
- Go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,Go 中提供了一種靈活,功能強悍的內建型別切片(“動態陣列”),與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。
切片的容量與長度
切片擴容的規則原始碼位置:/usr/local/go/src/runtime/slice.go 下的 growslice 函式
容量和長度的關係:初始時切片的容量和長度是相同的,如果切片的長度增加,已有容量不足以滿足長度,則go底層會將容量增加一倍,增加方式為copy出一個新的,舊的會被釋放掉(大於1024之後規則有所變化),以滿足長度增加,示例如下:
func TestArr(t *testing.T) { arr1 :=[]int{1,2,3,4} // cap 獲取切片的容量 // len 獲取切片的長度 // fmt.Printf("切片arr1:的容量 %v,長度為:%v, 地址為:%p \n" ,cap(arr1),len(arr1),&arr1) // append 像切片中追加新元素 可以追加多個 // arr2 並不是一個引用 arr1的值,是go底層copy出的一個新的值 arr2 := append(arr1,22,33) fmt.Printf("切片arr2的容量2:%v,長度為:%v, 地址為:%p \n",cap(arr2),len(arr2),&arr2) // 初始時切片的容量和長度是相同的,如果切片的長度增加,已有容量不足以滿足長度,則go底層會將容量增加一倍,以滿足長度增加 }
本作品採用《CC 協議》,轉載必須註明作者和本文連結