数组是具有相同 **唯一类型**的一组已编号且长度固定的数据项序列;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以 [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
}
```