學到什麼
什麼是陣列?
如何獲取陣列長度?
如何運算元組元素?
如何比較兩個陣列?
如何拷貝陣列?
如何建立多維陣列?
如何省略變數(補充)?
概念
陣列是一個長度固定和元素型別相同的集合,型別也可以自定義。如果想儲存任意型別,定義一個介面型別陣列。
陣列每個元素的位置,稱為索引。第一元素索引為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)
}
// 輸出
索引: 0 值 3
索引: 1 值 2
索引: 2 值 1
索引: 3 值 4
陣列比較
兩個陣列是否相等要考慮兩方面:
陣列必須是同一型別,這塊指的型別不是元素型別,而是陣列長度和元素型別決定陣列的型別,例如:
[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)
}
}
}
// 輸出
1行3列學生曠課
省略變數
在 Go 語言中,使用變數有個要求:“在函式體內,宣告瞭變數就必須使用”。如果不想使用,就使用“下劃線(_)”去省略。
舉兩個例子,省略函式返回的 b 變數和陣列迴圈的索引 i 。
a, b := fun1()
for i, v := range array {
...
}
// 省略後
a, _ := fun1()
for _, v := range array {
...
}
總結
本篇講解了 Go 語言內建集合中的陣列,還有對省略變數知識點的補充,因為太常用了。下篇將講解切片,它和陣列關係密切,所以本篇一定要掌握明白。如果遇到什麼問題,就在下方留言!
本作品採用《CC 協議》,轉載必須註明作者和本文連結