go陣列 切片

2021-10-12 04:52:22 字數 4614 閱讀 3673

1 如何定義陣列

陣列是具有相同型別且長度固定的一組連續資料。在go語言中我們可以使用如下幾種方式來定義陣列。

//方式一

var arr1 = [5]int{}

//方式二

var arr2 = [5]int

//方式三

var arr3 = [5]int

輸出以上三個變數的值如下所示:

arr1 [0 0 0 0 0]

arr2 [1 2 3 4 5]

arr3 [0 0 0 10 0]

而且在陣列的定義是包含其長度的,也就是說[3]int與[4]int是兩種不同的資料型別。

2. 如何運算元據

在上面的arr1我們沒有為其指定初值,那麼之後我們可以通過迴圈的方式為其賦予初值

迴圈賦值:

for i := 0; i < len(arr1); i++
此時我們再輸出一下陣列arr1,可以看到其值已經變化

arr1 update:  [0 10 20 30 40]
3. 多維陣列

go語言定義多維陣列,可以選擇的定義方式如下:

var arr4 =[5

][5]

int,

,}

輸出當前陣列,可以看到陣列內的值如下所示

[[1

2345

][67

8910]

[000

00][

0000

0][0

0000

]]

4 .陣列作為函式引數

go語言在傳遞陣列時會對其進行拷貝,所以如果傳遞的是大陣列的話會非常佔記憶體,所以一般情況下很少直接傳遞乙個陣列,避免這種情況我們可以使用以下兩種方式:

5. 指標陣列與陣列指標

對於指標陣列和陣列指標在c或c++中也經常被討論,尤其對於初學者來說會分辨不清楚。其實在每個詞中間新增乙個「的「就很好理解了,指標的陣列,陣列的指標

1)指標陣列

對於指標陣列來說,就是:乙個陣列裡面裝的都是指標,在go語言中陣列預設是值傳遞的,所以如果我們在函式中修改傳遞過來的陣列對原來的陣列是沒有影響的。

func

main()

func

test

(a [5]

int)

輸出

[00

000]

[020

00][

0000

0]

但是如果我們乙個函式傳遞的是指標陣列,情況會有什麼不一樣呢?

func

main()

for i :=

0; i <

5; i++

fmt.

println()

test1

(a)for i :=

0; i <

5; i++

}func

test1

(a [5]

*int

) fmt.

println()

}

我們先來看一下程式的執行結果

[

<

nil>

<

nil>

<

nil>

<

nil>

<

nil>]0

1234

0223

4022

34

可以看到初始化值全是nil,也就驗證了指標陣列內部全都是乙個乙個指標,之後我們將其初始化,內部的每個指標指向一塊記憶體空間。

2)陣列指標

了解了指標陣列之後,再來看一下陣列指標,陣列指標的全稱應該叫做,指向陣列的指標,在go語言中我們可以如下操作。

func

main()

func

test

(aptr *[5

]int

)

我們先定義了乙個陣列a,然後定乙個指向陣列a的指標aptr,然後將這個指標傳入乙個函式,在函式中我們改變了具體的值,程式的輸出結果

&[0

0000

]&[0

5000

]&[0

5000

]

因為陣列是固定長度的,所以在一些場合下就顯得不夠靈活,所以go語言提供了一種更為便捷的資料型別叫做切片。切片操作與陣列類似,但是它的長度是不固定的,可以追加元素,如果以達到當前切片容量的上限會再自動擴容。

1 如何定義切片

可以通過以下幾種方式定義切片

//方法一

var s1 =

int//方法二

var s2 =

int//方法三

var s3 =

make([

]int,5

)//方法四

var s4 =

make([

]int,5

,10)

方法一宣告了乙個空切片,方法二宣告了乙個長度為3的切片,方法三宣告了乙個長度為5的空切片,方法四宣告了乙個長度為5容量為10的切片。可以看到切片的定義與陣列類似,但是定義切片不需要為其指定長度。

我們可以通過len()和cap()這兩個函式來獲取切片的長度和容量,下面就來依次看下上面各切片的長度以及容量。

s1 0

0s2 [12

3]33

s3 [00

000]

55s4 [00

000]

510

如果我們通過這種方式定義乙個切片,那麼他會被賦予切片的空值nil。

var s5 [

]int

1.切片操作

我們可以通過如下的方式在陣列和切片上繼續獲取切片

func

main()

s :=

int s1 := arr[2:

4]s2 := arr[:3

] s3 := arr[2:

] s4 := s[1:

3]fmt.

println

("s1:"

, s1)

fmt.

println

("s2:"

, s2)

fmt.

println

("s3:"

, s3)

fmt.

println

("s4:"

, s4)

}

程式的輸出結果如下

s1:[3

4]s2:[12

3]s3:[34

5]s4:[78

]

可以看到切片操作是「包左不包右」

例如arr[2:4]是選擇arr陣列內下標為2,3的兩個元素。如果:左邊沒有起始位置則預設從頭開始,同理如果右邊沒有終止位置則預設到末尾。

2. 切片的擴充與拼接

我們之前介紹了切片的定義以及一些切片的操作,下面就來看一下如何對切片進行擴充。

func

main()

b := a[1:

3]b =

(b,4

) b =

(b,5

) b =

(b,6

) b =

(b,7

) fmt.

println

(a) fmt.

println

(b)}

程式輸出結果如下

[12

3][2

3456

7]

如果想要將兩個切片進行拼接可以使用如下這種方式:

func

main()

b := a[1:

3]fmt.

println

(b) a =

(a, b...

) fmt.

println

(a)}

如果我們想要將乙個切片的值複製給另乙個切片,go語言也提供了非常簡便的方式。

func

main()

b :=

make([

]int,3

)copy

(b, a)

fmt.

println

(a) fmt.

println

(b)}

go陣列 切片

陣列 陣列指標 fmt.println 陣列指標 i int var p 10 int i fmt.println p fmt.println p x,y 1,2 j int fmt.println j k 2 int l 2 int fmt.println k l 指向陣列的指標 m new 5 ...

go陣列與切片

go陣列 陣列宣告 var variable name size variable type eg var balance 10 float32 陣列初始化 var balance 5 float32 初始化陣列中 中的元素個數不能大於 中的數字。如果忽略 中的數字不設定陣列大小,go 語言會根據元...

go陣列與切片

陣列是具有相同唯一型別的一組長度固定的資料項序列,這種型別可以是任意的原始型別,例如整形,字元型或者自定義型別。陣列長度必須是乙個常量的表示式,並且是乙個非負整數。陣列元素可以用個索引累讀取,陣列長度最大為2gb。宣告格式為 var identifier len type 複製 例如 var arr...