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