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