切片擴容
相對于數組而言,使用切片的一個好處是:可以按需增加切片的容量。
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文章
4346瀏覽量
62977 -
數據結構
+關注
關注
3文章
573瀏覽量
40232 -
數組
+關注
關注
1文章
417瀏覽量
26028 -
切片
+關注
關注
1文章
22瀏覽量
8472
發布評論請先 登錄
相關推薦
關于大容量數組中某個元素的定位問題
labview中如何創造一個不斷增加的數組
數組在內存中的存儲解析
java中數組的三種定義方式_java中數組的定義及使用方法(推薦)
golang通過切片創建新的切片
![golang通過<b class='flag-5'>切片</b>創建新的<b class='flag-5'>切片</b>](https://file1.elecfans.com/web2/M00/A9/1B/wKgZomUjWr6AY0meAAB0n1dHELQ142.jpg)
golan共享底層數組的切片
![golan共享底層<b class='flag-5'>數組</b>的<b class='flag-5'>切片</b>](https://file1.elecfans.com/web2/M00/A9/1C/wKgZomUjXBGAMpeMAAArPBHUkYM846.jpg)
評論