切片擴容
相對于數組而言,使用切片的一個好處是:可以按需增加切片的容量。
Golang 內置的 append() 函數會處理增加長度時的所有操作細節。要使用 append() 函數,需要一個被操作的切片和一個要追加的值,當 append() 函數返回時,會返回一個包含修改結果的新切片。
函數 append() 總是會增加新切片的長度,而容量有可能會改變,也可能不會改變,這取決于被操作的切片的可用容量。
num := []int{1, 2, 3, 4, 5}
// 創建新的切片,其長度為 2 個元素,容量為 4 個元素
myNum := num[1:3]
// 使用原有的容量來分配一個新元素
// 將新元素賦值為 60
myNum = append(myNum, 60)
執行上面的代碼后的底層數據結構如下圖所示:
此時因為 myNum 在底層數組里還有額外的容量可用,append() 函數將可用的元素合并入切片的長度,并對其進行賦值。
由于和原始的切片共享同一個底層數組,myNum 中索引為 3 的元素的值也被改動了。
如果切片的底層數組沒有足夠的可用容量,append() 函數會創建一個新的底層數組,將被引用的現有的值復制到新數組里,再追加新的值,此時 append 操作同時增加切片的長度和容量:
// 創建一個長度和容量都是 4 的整型切片
num := []int{1, 2, 3, 4}
// 向切片追加一個新元素
// 將新元素賦值為 5
myNum := append(num, 5)
當這個 append 操作完成后,newSlice 擁有一個全新的底層數組,這個數組的容量是原來的兩倍:
函數 append() 會智能地處理底層數組的容量增長。
在切片的容量小于 1000 個元素時,總是會成倍地增加容量。一旦元素個數超過 1000,容量的增長因子會設為 1.25,也就是會每次增加 25%的容量(隨著語言的演化,這種增長算法可能會有所改變)。
-
函數
+關注
關注
3文章
4327瀏覽量
62573 -
數據結構
+關注
關注
3文章
573瀏覽量
40123 -
數組
+關注
關注
1文章
417瀏覽量
25939 -
切片
+關注
關注
1文章
22瀏覽量
8448
發布評論請先 登錄
相關推薦
評論