切片擴(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)如下圖所示:
此時因?yàn)?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文章
4277瀏覽量
62323 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
569瀏覽量
40072 -
數(shù)組
+關(guān)注
關(guān)注
1文章
412瀏覽量
25881 -
切片
+關(guān)注
關(guān)注
1文章
22瀏覽量
8439
發(fā)布評論請先 登錄
相關(guān)推薦
評論