Go 中切片擴容的策略

2021-10-11 19:03:59 字數 1567 閱讀 4327

如果切片的容量小於 1024 個元素,於是擴容的時候就翻倍增加容量。上面那個例子也驗證了這一情況,總容量從原來的4個翻倍到現在的8個。

一旦元素個數超過 1024 個元素,那麼增長因子就變成 1.25 ,即每次增加原來容量的四分之一。

注意:擴容擴大的容量都是針對原來的容量而言的,而不是針對原來陣列的長度而言的。

擴容後的陣列是新的嗎?

分為兩種情況:

1.情況一

func main() 

slice := array[0:2]

fmt.printf("before slice = %v, pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))

fmt.printf("before newslice = %v, pointer = %p, len = %d, cap = %d\n", newslice, &newslice, len(newslice), cap(newslice))

newslice[1] += 10

fmt.printf("after slice = %v, pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))

fmt.printf("after newslice = %v, pointer = %p, len = %d, cap = %d\n", newslice, &newslice, len(newslice), cap(newslice))

fmt.printf("after array = %v\n", array)

}

輸出

before slice = [10 20], pointer = 0xc4200c0040, len = 2, cap = 4

before newslice = [10 20 50], pointer = 0xc4200c0060, len = 3, cap = 4

after slice = [10 30], pointer = 0xc4200c0040, len = 2, cap = 4

after newslice = [10 30 50], pointer = 0xc4200c0060, len = 3, cap = 4

after array = [10 30 50 40]

具象圖為

這種情況也極容易出現在字面量建立切片時候,第三個引數 cap 傳值的時候,如果用字面量建立切片,cap 並不等於指向陣列的總容量,那麼這種情況就會發生。

slice := array[1:2:3]
上面這種情況非常危險,極度容易產生 bug 。

建議用字面量建立切片的時候,cap 的值一定要保持清醒,避免共享原陣列導致的 bug。

2.情況二:

所以建議盡量避免情況一,盡量使用情況二,避免 bug 產生。

golang中切片擴容後的大小問題

眾所周知,golang中切片在容量不足時會自動擴容,那麼擴容後的切片容量到底是多少呢?瀏覽了很多文章,絕大多數給出的答案都是小於1024時為原來的2倍,大於1024時是1.25倍,因為原始碼中這樣一段 src runtime slice.go 100 newcap old.cap doublecap...

Go語言中切片slice的宣告與使用

go語言中的切片,是一種動態陣列,它是對陣列的擴充套件。2.1.1 宣告 個未指定 度的陣列來定義切 2.1.2 使 make 函式來建立切 package main import fmt func main 效果如下 圖 1 列印切片的長度 容量和資料元素 s int陣列 arr 5 int可以通...

Go語言學習11 切片擴容

先思考乙個問題 如何給切片新增元素?下面這串 行不行?是錯誤的,不能直接用s1 3 來新增元素,否則會造成索引越界。package main import fmt func main s1 3 shenzhen 錯誤!索引越界!fmt.println s1 func main s1 3 shenzh...