剛剛寫了乙個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...