切片擴(kuò)容
相對于數(shù)組而言,使用切片的一個好處是:可以按需增加切片的容量。
Golang 內(nèi)置的 append() 函數(shù)會處理增加長度時的所有操作細(xì)節(jié)。要使用 append() 函數(shù),需要一個被操作的切片和一個要追加的值,當(dāng) append() 函數(shù)返回時,會返回一個包含修改結(jié)果的新切片。
函數(shù) append() 總是會增加新切片的長度,而容量有可能會改變,也可能不會改變,這取決于被操作的切片的可用容量。
num := []int{1, 2, 3, 4, 5}
// 創(chuàng)建新的切片,其長度為 2 個元素,容量為 4 個元素
myNum := num[1:3]
// 使用原有的容量來分配一個新元素
// 將新元素賦值為 60
myNum = append(myNum, 60)
執(zhí)行上面的代碼后的底層數(shù)據(jù)結(jié)構(gòu)如下圖所示:
此時因為 myNum 在底層數(shù)組里還有額外的容量可用,append() 函數(shù)將可用的元素合并入切片的長度,并對其進(jìn)行賦值。
由于和原始的切片共享同一個底層數(shù)組,myNum 中索引為 3 的元素的值也被改動了。
如果切片的底層數(shù)組沒有足夠的可用容量,append() 函數(shù)會創(chuàng)建一個新的底層數(shù)組,將被引用的現(xiàn)有的值復(fù)制到新數(shù)組里,再追加新的值,此時 append 操作同時增加切片的長度和容量:
// 創(chuàng)建一個長度和容量都是 4 的整型切片
num := []int{1, 2, 3, 4}
// 向切片追加一個新元素
// 將新元素賦值為 5
myNum := append(num, 5)
當(dāng)這個 append 操作完成后,newSlice 擁有一個全新的底層數(shù)組,這個數(shù)組的容量是原來的兩倍:
函數(shù) append() 會智能地處理底層數(shù)組的容量增長。
在切片的容量小于 1000 個元素時,總是會成倍地增加容量。一旦元素個數(shù)超過 1000,容量的增長因子會設(shè)為 1.25,也就是會每次增加 25%的容量(隨著語言的演化,這種增長算法可能會有所改變)。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62977 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40232 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26028 -
切片
+關(guān)注
關(guān)注
1文章
22瀏覽量
8472
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于大容量數(shù)組中某個元素的定位問題
labview中如何創(chuàng)造一個不斷增加的數(shù)組
數(shù)組大小的增加 怎么拉動
數(shù)組在內(nèi)存中的存儲解析
java中數(shù)組的三種定義方式_java中數(shù)組的定義及使用方法(推薦)
SystemVerilog中數(shù)組的賦值、索引和切片
帶你了解SystemVerilog中的關(guān)聯(lián)數(shù)組
![帶你了解SystemVerilog<b class='flag-5'>中</b>的關(guān)聯(lián)<b class='flag-5'>數(shù)組</b>](https://file1.elecfans.com/web2/M00/89/62/wKgaomSChR-AazDjAAAwrS_L4eA710.png)
Go切片的內(nèi)部實現(xiàn)
![Go<b class='flag-5'>切片</b>的內(nèi)部實現(xiàn)](https://file1.elecfans.com/web2/M00/A7/58/wKgaomUjWdiAHvDYAABJeRaC9qQ650.jpg)
golang通過切片創(chuàng)建新的切片
![golang通過<b class='flag-5'>切片</b>創(chuàng)建新的<b class='flag-5'>切片</b>](https://file1.elecfans.com/web2/M00/A9/1B/wKgZomUjWr6AY0meAAB0n1dHELQ142.jpg)
golan共享底層數(shù)組的切片
![golan共享底層<b class='flag-5'>數(shù)組</b>的<b class='flag-5'>切片</b>](https://file1.elecfans.com/web2/M00/A9/1C/wKgZomUjXBGAMpeMAAArPBHUkYM846.jpg)
評論