golang中slice的擴容機制

2021-10-20 18:59:42 字數 779 閱讀 6127

在golang中slice是乙個指向陣列的指標結構體。 這個結構體有三個屬性:

其概念為"動態陣列",及陣列的容量大小(cap)會隨著陣列的實際大小(size)變化而變化(擴容)。

擴容機制:

如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2;一旦元素個數超過1024個元素,則乘以1.25,即每次增加原來容量的四分之一。

拷貝問題:

slice的拷貝屬於引用拷貝。拷貝後的slice如果擴容之後,還沒有觸及原陣列的容量,那麼,切片中的指標指向的位置,就還是原陣列,

如果擴容之後,超過了原陣列的容量,那麼,go就會開闢一塊新的記憶體,把原來的值拷貝過來,這種情況絲毫不會影響到原陣列。

//cap超過原陣列,原陣列不改變

func demoone(demoarray int) int

//cap未超過原陣列,原陣列改變

func demotwo(demoarray int) int

func arraytest()

log.println(demoone(demoarray))

log.println(demotwo(demoarray))

}

輸出:

[2,4]

[3,4]

在golang1.16之前,slice拷貝時,新陣列的cap等於原陣列的len,golang1.16之後,新陣列的cap等於原陣列的cap

Golang中的Slice自動擴容機制

剛剛寫了乙個api用到了golang的slice,想著用slice這麼久了竟然不知道這到底是個什麼東西。只知道slice和常規陣列相比是可自動變長的,內部到底是怎麼實現的呢?於是今天就和同事一起研究了一下golang中slice的自動擴容機制,這裡採用的是golang1.12版本。閒話少說,直接開整...

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...