認真一點學 Go:7. 內建集合 - 陣列

printlove發表於2021-09-13

學到什麼

  1. 什麼是陣列?

  2. 如何獲取陣列長度?

  3. 如何運算元組元素?

  4. 如何比較兩個陣列?

  5. 如何拷貝陣列?

  6. 如何建立多維陣列?

  7. 如何省略變數(補充)?

概念

陣列是一個長度固定和元素型別相同的集合,型別也可以自定義。如果想儲存任意型別,定義一個介面型別陣列。

認真一點學 Go:7. 內建集合 - 陣列

陣列每個元素的位置,稱為索引。第一元素索引為0,第二個為1,以此類推。

宣告

宣告格式: var 陣列名 [長度]型別

舉例:宣告一個長度為 4,元素型別為 int 的陣列。


var nums [4]int

// 列印

[0 0 0 0]

宣告後每個元素預設初始化為 0 ,如果是字串陣列,預設初始化為空字串。

初始化

陣列有多種初始化方式,一一列舉說明,以下我用 := 簡寫方式。

方式一:初始化每個元素,如果超過陣列長度,編譯時會提示越界錯誤。


nums := [4]int{3, 2, 1, 4}

方式二:初始化部分元素,只有索引 0 和 1 被賦值,後面的元素預設為 0 。


nums := [4]int{3, 2}

// 列印

[3 2 0 0]

方式三:使用 key/value 形式初始化指定索引元素,也可以和上面方式混合。


nums := [4]int{0: 3, 3: 4}

或

nums := [4]int{3, 3: 4}

// 列印

[3 0 0 4]

方式四:不指定陣列長度,使用 ... 讓編譯器自己決定陣列的長度。


// 陣列長度為 4

nums := [...]int{3, 2, 1, 4}

獲取陣列的長度

使用內建的函式 len 獲取陣列的長度。


len(array)

還可以用於獲取切片、map、字串、通道的長度。

陣列元素操作

1. 獲取元素

使用索引獲取陣列的元素,後面要講的切片獲取方式也是如此。


nums := [...]int{3, 2, 1, 4}

fmt.Println(nums[1])

// 輸出

2

2. 設定元素

當有了一個陣列後,後面可以對此陣列元素進行修改。


nums := [...]int{3, 2, 1, 4}

nums[1] = 3

fmt.Println(nums)

// 輸出

[3 3 1 4]

遍歷陣列

使用“for 迴圈語句”遍歷陣列,上篇“流程控制”中有詳細的“for 迴圈語句”講解。

遍歷陣列有兩種方式,第一種是“迭代計數”,第二種“for-range”,使用如下:

1. 迭代計數


nums := [...]int{3, 2, 1, 4}

for i := 0; i < len(nums); i++ {

    fmt.Println(nums[i])

}

2. for-range


for i, v := range nums {

   fmt.Println("索引:", i, " 值", v)

}

// 輸出

索引: 03

索引: 12

索引: 21

索引: 34

陣列比較

兩個陣列是否相等要考慮兩方面:

  • 陣列必須是同一型別,這塊指的型別不是元素型別,而是陣列長度和元素型別決定陣列的型別,例如: [2]int{1, 2} 它的型別是 [2]int ,不要誤以為是 array

  • 陣列元素相等


a := [2]int{1, 2}

b := [2]int{1, 2}

if a == b {

    print("相等")

} else {

    print("相等")

}

// 輸出

相等

注:如果 b 的初始化方式為 [...]int{1, 2} , a 和 b 依然是相等的,因為型別還是 [2]int

陣列拷貝

在 Go 語言中,陣列是值型別,也就是說在傳遞過程中會自動拷貝一份。


nums := [...]int{3, 2, 1, 4}

numsCopy := nums

numsCopy[1] = 3

fmt.Println("nums:", nums)

fmt.Println("numsCopy:", numsCopy)

// 輸出

nums: [3 2 1 4]

numsCopy: [3 3 1 4]

多維陣列

為了更好的理解多維陣列,現在還原一個場景。

現在有間教室,裡面有 4 行 3 列的座位,現在讓你記錄每個座位學生的狀態,0表示曠課、1表示請假、2表示已到場。

1. 宣告

先看看多維陣列如何宣告。

二維陣列格式:


var 陣列名 [長度][長度]型別 

三維陣列格式:


var 陣列名 [長度][長度][長度]型別 

依次類推可以繼續宣告四維陣列、五維陣列等等。

繼續回到上面的場景,可以確定需要一個 4 行 3 列的二維陣列。


var students [4][3]int

3. 初始化

設定每個學生的狀態,可以看出 1 行 3 列學生曠課(值為0),3 行 2列學生請假(值為1)。


students := [4][3]int{

    {2, 2, 0},

    {2, 2, 2},

    {2, 1, 2},

    {2, 2, 2},

}

4. 遍歷二維陣列

使用“迭代計數”方式遍歷 students 陣列,輸出曠課的學生座位。


// collection/mult-array.go

for i := 0; i < 4; i++ {

    for j := 0; j < 3; j++ {

        if students[i][j] == 0 {

            fmt.Printf("%d行%d列學生曠課", i+1, j+1)

        }

    }

}

// 輸出

13列學生曠課

省略變數

在 Go 語言中,使用變數有個要求:“在函式體內,宣告瞭變數就必須使用”。如果不想使用,就使用“下劃線(_)”去省略。

舉兩個例子,省略函式返回的 b 變數和陣列迴圈的索引 i 。


a, b := fun1()

for i, v := range array {

    ...

}

// 省略後

a, _ := fun1()

for _, v := range array {

    ...

} 

總結

本篇講解了 Go 語言內建集合中的陣列,還有對省略變數知識點的補充,因為太常用了。下篇將講解切片,它和陣列關係密切,所以本篇一定要掌握明白。如果遇到什麼問題,就在下方留言!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章