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

2021-10-17 15:35:02 字數 1428 閱讀 9366

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的切片

myslice =

(myslice,1,

2,3)

//後者的引數型別其實是不定引數

myslice2 =

intmyslice =

(myslice, myslice2...

) 加入...表示打散後傳入

copy()深複製slice

slice1 :=

intslice2 :=

intcopy

(slice2, slice1)

//copy slice的前3個元素到slice2

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

和陣列區別

func

arraymodify

(array [5]

int)

func

slicemodify

(slice [

]int

)func

main()

slice :=

intarraymodify

(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的用法以及和陣列的區別

說明 slice是go的乙個語言特性,其實有點類似於cpp的vector,可變長度,可以擴充套件空間。今天詳細看了下,做下總結。slice本質上是乙個區間,原型是t,大致的實現是這樣的 type slice struct可以看到的是是乙個指向陣列的指標,那麼在修改slice的時候會改變陣列的值。用法...

block的用法和陣列排序

一 block我們 都知道函式只可以巢狀呼叫 但決不允 許函式的巢狀定義,這有時給我 們帶來了很大的不便,而 oc提供的 block用法為 我們解決了這個問題 下面簡單說一下 1,block 的用法 1 block 是用來儲存函式 所以給block 賦值時賦 的是整個函式的實現,例如,要在main ...

extern指標和陣列的用法

void main 你可以選擇除錯,或者去看彙編 但是問題的本質,也許不是那麼簡單的,因為我們選擇任何除錯的時候都是經過編譯完成之後所看到的,而這個錯誤恰恰需要我們去提前認識到在編譯的時候做了乙個怎麼樣的處理。在學習的時候也許有過這樣的解釋,指標和陣列是不同的,只是有時候可以通用而已。在extern...