切片
Go中提供了一種靈活,功能強悍的內置類型Slices切片(“動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。
切片中有兩個概念:一是len長度,二是cap容量,長度是指已經被賦過值的最大下標+1,可通過內置函數len()獲得。
容量是指切片目前可容納的最多元素個數,可通過內置函數cap()獲得。切片是引用類型,因此在當傳遞切片時將引用同一指針,修改值將會影響其他的對象。
s := []int {1,2,3 } //直接初始化切片
s := arr[:] //用數組初始化切片
s = make([]int, 3) //make初始化,有3個元素的切片, len和cap都為3
s = make([]int, 2, 3) //make初始化,有2個元素的切片, len為2, cap為3
a = append(a, 1) // 追加1個元素
a = append(a, 1, 2, 3) // 追加多個元素, 手寫解包方式
a = append(a, []int{1,2,3}...) // 追加一個切片, 切片需要解包
不過要注意的是,在容量不足的情況下,append的操作會導致重新分配內存,可能導致巨大的內存分配和復制數據代價。
a = append([]int{0}, a...) 切片頭部添加元素。在開頭一般都會導致內存的重新分配,而且會導致已有的元素全部復制1次。
因此,從切片的開頭添加元素的性能一般要比從尾部追加元素的性能差很多。
//切片是地址傳遞
func updateSlice(a []int) {
a[0] = 3
}
func main() {
//切片
var a = []int{1, 2, 3}
c := make([]int, 5)
copy(c, a)
updateSlice(c)
fmt.Println(c)
}
打印
[3 2 3 0 0]
切片的內部實現
切片是一個很小的對象,它對底層的數組(內部是通過數組保存數據的)進行了抽象,并提供相關的操作方法。
切片是一個有三個字段的數據結構,這些數據結構包含 Golang 需要操作底層數組的元數據:
這 3 個字段分別是指向底層數組的指針、切片訪問的元素的個數(即長度)和切片允許增長到的元素個數(即容量)。
-
數據結構
+關注
關注
3文章
573瀏覽量
40095 -
數組
+關注
關注
1文章
416瀏覽量
25912 -
切片
+關注
關注
1文章
22瀏覽量
8441
發布評論請先 登錄
相關推薦
評論