數組是具有相同 **唯一類型**的一組已編號且長度固定的數據項序列;這種類型可以是任意的原始類型例如整型、字符串或者自定義類型。數組長度必須是一個常量表達式,并且必須是一個非負整數。數組長度也是數組類型的一部分,所以 [5] int 和 [10] int 是屬于不同類型的。
聲明的格式是`var identifier [len]type`。例如:`var arr1 [5]int`
對索引項為 i 的數組元素賦值可以這么操作:arr[i] = value,所以數組是 可變的。
## 初始化賦值
```
package main
import "fmt"
func main() {
a, b, c := 1, 2, 3
// 第一種
arr1 := [5]int{a, b, c ,4, 5}
// 第二種,可以忽略數組中元素
arr2 := [5]int{1, 2, 3}
// 第三種
var arr3 = [...]int{5, 6, 7, 8}
// 第四種,key: value syntax,數組長度可以省略,默認長度為數組索引最大值
var arr4 = [5]int{3: 3, 4: 4}
// 輸出: [0 0 0 3 4]
fmt.Printf("arr1-type: %T; arr2-type: %T; arr3-type: %T; arr4-type: %T", arr1, arr2, arr3, arr4)
// arr1-type: [5]int; arr2-type: [5]int; arr3-type: [4]int; arr4-type: [5]int
}
```
## 多維數組
Go語言中允許使用多維數組,因為數組屬于值類型,所以多維數組的所有維度都會在創建時自動初始化零值,多維數組尤其適合管理具有父子關系或者與坐標系相關聯的數據,例如:[3][5]int(第一維3個元素,第二維5個元素),[2][2][2]float64。
內部數組總是長度相同的。Go 語言的多維數組是矩形式的(唯一的例外是切片的數組)
聲明并賦值 `var array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}`
```
package main
import "fmt"
const (
ONE = 3
TWO = 2
)
type pixel int
var screen [ONE][TWO]pixel
func main() {
for y := 0; y < TWO; y++ {
for x := 0; x < ONE; x++ {
screen[x][y] = pixel(x) // 此處需要用類型轉換
}
}
fmt.Println(screen) // [[0 0] [1 1] [2 2]]
}
```
## 比較兩個數組是否相等
如果兩個數組類型相同(包括數組的長度,數組中元素的類型)的情況下,我們可以直接通過較運算符(==和!=)來判斷兩個數組是否相等,只有當兩個數組的所有元素都是相等的時候數組才是相等的,不能比較兩個類型不同的數組,否則程序將無法完成編譯。
```
package main
import "fmt"
func main() {
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 編譯錯誤:無法比較 [2]int == [3]int
}
```