Golang中的Slice自動擴容機制

2021-09-26 15:26:00 字數 1336 閱讀 3677

剛剛寫了乙個api用到了golang的slice,想著用slice這麼久了竟然不知道這到底是個什麼東西。

只知道slice和常規陣列相比是可自動變長的,內部到底是怎麼實現的呢?

於是今天就和同事一起研究了一下golang中slice的自動擴容機制,這裡採用的是golang1.12版本。

閒話少說,直接開整:

例1:

package main

import (

"fmt"

)func main()

for i := 0; i < 6; i++

}

輸出結果:

1

1--------22

--------43

--------44

--------85

--------86

--------

由輸出結果可以看出,容量達到2之後,當長度大於2時,slice的容量會自動擴容為原來的2倍。

這裡可以得出,slice的容量會自動擴容的起點是2。

例2:

package main

import (

"fmt"

)func main()

}

輸出結果:

10

6--------107

--------108

--------109

--------

1010

--------

2011

--------

2012

--------

2013

--------

2014

--------

2015

--------

看出來例2與例1的區別了吧,當定義乙個有初始長度的切片時,切片的容量為初始長度的2倍。
1.當切片的容量超過2048之後再次擴容每次只會擴容512個,但不是固定的,具體可以看下原始碼,這裡我是使用的goland,對應包的路徑為:

/usr/local/cellar/go/1.12/libexec/src/runtime/slice.go 方法名:growslice()

2.每一次擴容都會重新開闢一塊記憶體空間,這塊記憶體空間是原來記憶體空間的2倍,然後將老的資料複製到新開闢的記憶體空間中,然後釋放

老的記憶體空間。

golang中slice的擴容機制

在golang中slice是乙個指向陣列的指標結構體。這個結構體有三個屬性 其概念為 動態陣列 及陣列的容量大小 cap 會隨著陣列的實際大小 size 變化而變化 擴容 擴容機制 如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2 一旦元素個數超過1024個元素,則乘...

golang中的空slice案例

package main func main 執行成功 補充 golang slice 詳解 func main var slice array 1 7 array startindex endindex 不包含endindex 2.直接建立陣列切片 slice2 make int,5,10 3.直...

分析golang的slice排序

今天寫 牽扯到給乙個slice排序的問題,發現go的sort包裡支援自定義排序,果斷拿來用了。sort.slice pricelist,func i,j int bool 上面這個是使用sort.slice 的例子。在此之前,先講講基礎的sort方法,type inte ce inte ce fun...