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

Go切片的內(nèi)部實(shí)現(xiàn)

golang通過(guò)切片創(chuàng)建新的切片

golan共享底層數(shù)組的切片

評(píng)論