目錄
一、切片介紹
二、切片使用
切片建立
陣列和切片的區別
切片的實現原理
切片建立可以通過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...