slice記憶體分析

2021-10-01 13:28:56 字數 1101 閱讀 2328

切片是引用型別的資料

每乙個切片引用了底層的陣列

切片本身不儲存任何資料,都是這個底層的陣列儲存,所以修改切片也就是修改這個陣列中的資料

向切片中新增資料的時候,如果沒有超過容量,直接新增,如果超過容量自動增長

切片一旦擴容,就重新指向乙個新的底層陣列

package main

import

"fmt"

func

main()

fmt.

println

(slice1)

fmt.

printf(,

len(slice1)

,cap

(slice1)

, slice1)

//0xc0000a8020這裡最後乙個引數的slicel是切片引用的底層陣列位址,加&的話就代表切片本身的引用位址了

fmt.

println

("***********************************="

) slice1 =

(slice1,1)

fmt.

println

(slice1)

fmt.

printf(,

len(slice1)

,cap

(slice1)

, slice1)

//0xc0000b2040切片擴容後重新指向乙個新的底層陣列

//slice2 := slice1

//slice2[0] = 1000

長度:4

容量:4

***********************************=

[1 2 3 4 1]

長度:5

容量:8

*/

再次總結: slice指向的是乙個底層的陣列可以通過格式化輸出fmt,printf切片名 檢視指向陣列的引用位址, 注意區分&切片名檢視的是切片本身的應用,它的容量和長度是可以自增長的,,當長度超過容量容量會自動成倍增長, 切自動增長後底層陣列的引用位址也會發生變化,

切片本身是不儲存資料的,都是底層資料進行儲存的,通過下標修改其實就是修改陣列的元素,

slice記憶體分配

slice是golang提供的乙個很好的符合型別。既支援資料動態擴充套件,又能隨機訪問,使資料保持很好的區域性性。但是slice有乙個效能可能導致資料的一致性和預期不一致,就是它會按需為slice收集記憶體。參考這段 package main import fmt func main what s ...

關於slice分配記憶體

slice是golang提供的乙個很好的符合型別。既支援資料動態擴充套件,又能隨機訪問,使資料保持很好的區域性性。但是slice有乙個效能可能導致資料的一致性和預期不一致,就是它會按需為slice收集記憶體。參考這段 output data v is one three data q is one ...

Slice原始碼分析

package runtime import runtime internal math runtime internal sys unsafe slice 包括array,這是乙個指標,指向實際資料儲存的位置,len是當前的切片資料長度,cap是容量。type slice struct 此處涉及到...