Golang slice的用法以及和陣列的區別

2021-08-19 16:22:23 字數 1135 閱讀 9986

說明

slice是go的乙個語言特性,其實有點類似於cpp的vector,可變長度,可以擴充套件空間。今天詳細看了下,做下總結。

slice本質上是乙個區間,原型是t,大致的實現是這樣的:

type slice struct
可以看到的是是乙個指向陣列的指標,那麼在修改slice的時候會改變陣列的值。

用法

和陣列的用法差別不是太大。

var myarrary [3]int = [3]int

var myslice int = myarray[:2] //[first:last]方式,不足時補0

myslice = make(int,5)//建立了長度為5初值為0的切片

myslice = make(int,5,10)//建立了長度為5,容量為10的切片

myslice2 = int

copy()深複製slice

slice1 := int

slice2 := int

copy(slice2, slice1)//copy slice的前3個元素到slice2

slice2 = slice1 //會複製乙份引用給slice2

func arraymodify(array [5]int) 

func slicemodify(slice int)

func main()

slice := int

arraymodify(array)

slicemodify(slice)

fmt.println(array)

fmt.println(slice)

}// [1 2 3 4 5]

// [88 2 3 4 5]

可以看到的是陣列傳的是值,不會改變元素的值,這一點和c/cpp不同,而雖然slice也是值語義,但是其本身是指標型別的,所以會改變值,但不意味著slice傳引用,這一點需要注意。後面會詳細講值語義帶來的問題。

Golang slice 的底層實現

首先我們來看段 的輸出 s make int,4 for i 0 i 4 i s0 s 0 fmt.println s 輸出的結果是 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 帶著這些疑問,我們來看看slice的底層實現。slice的結構 type slice structar...

golang slice 與list 的效能分析。

一 比較slice 與 list 遍歷建立和新增元素速度。package main import time fmt container list func main fmt.println slice 建立速度 time.now sub t string t time.now l list.new ...

golang slice的判空 和 併發安全

判斷slice是否為空,不能與nil進行比較做判斷,因為slice有可能已初始化。而是應該使用len計算長度。例如package main import fmt func main fmt.println slice1 nil slice1 nil fmt.println slice1 len le...