如果切片的容量小於 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...