Array 类型 - Array Types

← 返回数据类型

数组是固定长度的相同类型元素序列。

数组基础

数组声明

// 声明数组,元素为零值
var arr1 [5]int
fmt.Println(arr1)  // [0 0 0 0 0]

// 声明并初始化
arr2 := [3]int{1, 2, 3}
fmt.Println(arr2)  // [1 2 3]

// 让编译器计算长度
arr3 := [...]int{1, 2, 3, 4}
fmt.Println(arr3)  // [1 2 3 4]

数组访问

arr := [3]int{10, 20, 30}

// 访问元素
fmt.Println(arr[0])  // 10

// 修改元素
arr[1] = 99
fmt.Println(arr)  // [10 99 30]

// 获取长度
fmt.Println(len(arr))  // 3

数组长度是类型的一部分

// [3]int 和 [4]int 是完全不同的类型
var a1 [3]int
var a2 [4]int

// ❌ 不能赋值
// a1 = a2  // 编译错误:类型不匹配

// 只能赋值给相同长度和类型的数组
var a3 [3]int
a3 = a1  // ✅ 正确

重要 数组长度是类型的一部分,不同长度的数组是不同类型

数组初始化

// 指定索引初始化
arr := [5]int{1: 10, 3: 30}
fmt.Println(arr)  // [0 10 0 30 0]

// 部分初始化,其余为零值
arr2 := [5]int{1, 2}
fmt.Println(arr2)  // [1 2 0 0 0]

// 使用 [...] 让编译器计算长度
arr3 := [...]string{"a", "b", "c"}
fmt.Println(len(arr3))  // 3

数组是值类型

arr1 := [3]int{1, 2, 3}
arr2 := arr1  // 拷贝整个数组

arr2[0] = 99
fmt.Println(arr1)  // [1 2 3] - 原数组不受影响
fmt.Println(arr2)  // [99 2 3] - 副本被修改

注意 数组赋值会拷贝整个数组,对于大数组性能开销较大。

多维数组

// 声明二维数组
var matrix [3][4]int

// 初始化二维数组
matrix2 := [2][3]int{
    {1, 2, 3},
    {4, 5, 6},
}
fmt.Println(matrix2)

// 访问元素
fmt.Println(matrix2[0][1])  // 2

// 遍历二维数组
for i := 0; i < len(matrix2); i++ {
    for j := 0; j < len(matrix2[i]); j++ {
        fmt.Printf("%d ", matrix2[i][j])
    }
    fmt.Println()
}

数组比较

// 数组可以比较(相同类型和长度)
a1 := [3]int{1, 2, 3}
a2 := [3]int{1, 2, 3}
a3 := [3]int{1, 2, 4}

fmt.Println(a1 == a2)  // true
fmt.Println(a1 == a3)  // false

// 不同长度的数组不能比较
// a1 == [4]int{...}  // 编译错误

限制 只有元素类型可比较的数组才能比较(如 []int 不行,但 [N]int 可以)。

数组 vs 切片

特性数组 [N]T切片 []T
长度固定,编译时确定动态,运行时变化
作为参数拷贝整个数组传递引用
比较可以(相同长度)不可以
使用场景固定大小数据动态数据集合

练习

  1. 创建一个 3x3 矩阵并计算对角线元素之和
  2. 实现数组反转函数
  3. 找出数组中的最大值和最小值

← 字符串 | 切片 →