go切片基礎及記憶體分配

2021-10-11 09:17:12 字數 2267 閱讀 4803

目錄

一、切片介紹

二、切片使用

切片建立

陣列和切片的區別

切片的實現原理

切片建立可以通過make函式,如建立乙個整形切片

//長度len=5,cap=5,使用make建立切片,不指定第3個引數時,預設切片容量等於長度

mslic := make(int,5)

此時,列印該切片,切片值為[0,0,0,0,0],即預設初始化為0.

除了用make外還能用指定切片元素建立,如下

//長度和容量依舊相等,為5

mslic := int

陣列和切片最本質的區別就是陣列是值型別,切片是引用,且陣列定長無法擴容,而切片可以。

//陣列初始化,乙個長度為5的定長陣列

marray  := [5]

//不定長陣列

marray := [...]

可以看到陣列與切片的建立形式完全不同。

切片的實現其實是通過陣列實現的,前面說過切片是引用,那麼怎麼引用?引用的又是誰?如下圖

中間為陣列,上面為切片mslic的建立,mslic的位址指向了陣列,即切片是指向底層陣列空間的,

當用切片mslic去建立切片nslic時,將位址mslic位址向後移動,返回新的位址即為nslic的空間,

可以看到,切片建立切片時兩個切片mslic和nslic共享同乙個陣列空間,此時若是nslic[1] = 70,那麼讀者覺得mslic會發生什麼呢?

沒錯,和你心裡想 的一樣,mslic[2]會從30-->70,直接上**展示,如下

func slic_dist() 

// 建立新的切片,其長度為 2 個元素,容量為 5

nslic := mslic[1:3]

nslic[1] = 70

fmt.println("nslic:", nslic)

fmt.println("mslic:", mslic)

//剛分配好切片的位址

fmt.printf("%v,%p\n", nslic, nslic)

// 使用原有的容量來分配乙個新元素

// 將新元素賦值為 80

fmt.printf("%v,%p\n", nslic, nslic)

//繼續增加元素90

fmt.printf("%v,%p\n", nslic, nslic)

//繼續增加元素100

fmt.printf("%v,%p\n", nslic, nslic)

//繼續增加元素110,位址發生變化

fmt.printf("%v,%p\n", nslic, nslic)

}

結果:

nslic: [20 70]

mslic: [10 20 70 40 50 60]

[20 70],0xc00000a308

[20 70 80],0xc00000a308

[20 70 80 90],0xc00000a308

[20 70 80 90 100],0xc00000a308

[20 70 80 90 100 110],0xc0000140f0

從上述示例中可發現,確實和你們想的一樣,原切片mslic的第3個元素值隨新切片nslic的第2個值變化而變化,從30-->70,也充分說明了切片是依賴陣列實現的,

且依賴切片建立的切片共享同乙個底層陣列空間,還有一點需要注意的是用切片建立切片,那麼新切片不能超過原切片的容量,比如mslic的cap=6,那麼建立

新切片nslic時,nslic的cap<6,必須小於6,這是由於切片建立切片的方式是基於原來切片大小來的,而不是開闢新空間。

後面的位址列印是不斷給新切片nslic增加元素,nslic位址的變化,你會發現當增加至第4個元素即nslic元素總數為6時nslic位址發生了變化,從0xc00000a308-->0xc0000140f0,

說明nslic重新指向了乙個新的陣列空間,而將原nslic指向陣列中的值複製到了新陣列空間,完成了nslic的記憶體重新分配。

以上便是切片的一些基礎及實現總結,沒有好的畫圖軟體,只能用畫圖工具來替代,讀者見諒!

go 記憶體分配

二者都是在堆上分配記憶體,但是它們的行為不同,適用於不同的型別 new 函式分配記憶體,make 函式初始化 new t 為型別t分配一塊記憶體,並返回指向這塊記憶體位址的指標,它適用於值型別如陣列和結構體 make t 初始化內建的資料結構,返回乙個型別為 t 的空值,它只適用於3種內建的引用型別...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

Go語言基礎 切片

切片 slice 是乙個擁有相同型別元素的可變長度的序列。它是基於陣列型別做的一層封裝。它非常靈活,支援自動擴容。切片是乙個引用型別,它的內部結構包含位址 長度和容量。切片一般用於快速地操作一塊資料集合。陣列的長度是固定的並且陣列長度屬於型別的一部分,所以陣列有很多的侷限性。1 func array...