💜 想真正擅长编程? 从一门课程开始,100% 免费

《笔记》第十三篇 Go数组说明

第13讲 Go数组说明

本讲基于视频实际讲解内容整理


一、数组简介

老师开场提到,Go的数组类似于Java中的数组,是编程中常用的数据结构。

数组的定义方式:

Go
// 定义一个长度为3的int数组
var a [3]int

二、数组声明与初始化

2.1 声明指定长度的数组

Go
package main

import "fmt"

func main() {
    // 声明一个长度为10的int数组
    var a [10]int

    // 不赋值时,所有元素默认为零值(0)
    fmt.Println(a)  // [0 0 0 0 0 0 0 0 0 0]

    // 通过下标赋值
    a[0] = 1
    fmt.Println(a)  // [1 0 0 0 0 0 0 0 0 0]
}

要点:数组声明时如果不初始化,所有元素会被自动初始化为元素类型对应的零值。对于数字类型来说,零值就是 0。

2.2 声明时直接初始化

Go
package main

import "fmt"

func main() {
    // 方式一:指定长度并初始化
    var b [3]int = [3]int{1, 2, 3}
    fmt.Println(b)  // [1 2 3]

    // 方式二:自动推导长度(使用 ... 省略号)
    c := [...]int{9, 7, 1}
    fmt.Println(c)  // [9 7 1]

    // 方式三:短变量声明
    d := [3]int{100, 200, 300}
    fmt.Println(d)
}

三、数组的核心特性

3.1 下标访问

  • 数组的每个元素通过下标来访问
  • 下标从 0 开始,到 数组长度 - 1 结束
  • 可以通过下标读取和修改元素
Go
a[0] = 100    // 修改
fmt.Println(a[0])  // 读取

3.2 len() 函数

Go内置的 len() 函数可以返回数组的元素个数:

Go
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(len(arr))  // 5

3.3 默认零值初始化

数组的每个元素在声明时会被自动初始化为元素类型对应的零值:

元素类型 零值
int/float 0
bool false
string "" (空字符串)
指针 nil

3.4 省略号(...)自动推导长度

当声明数组时不确定长度,可以使用 ... 让编译器根据初始化值的个数自动推导:

Go
// 编译器自动推导长度为4
arr := [...]int{10, 20, 30, 40}
fmt.Println(len(arr))  // 4

重要限制:... 只能用在数组的推导上面,不能用在切片上。老师在视频中特别强调了这个区别。


四、数组与切片的区别

老师在视频中也提到了切片(slice),但说明"切片先不管,后面再说"。关键区别:

特性 数组 切片
长度 固定 可变
声明 [3]int []int
... 推导 ✅ 支持 ❌ 不支持

五、完整代码示例

Go
package main

import "fmt"

func main() {
    // 1. 声明数组,默认零值
    var a [10]int
    fmt.Println("默认零值:", a)

    // 2. 通过下标赋值
    a[0] = 100
    a[1] = 200
    fmt.Println("赋值后:", a)

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

    // 4. 自动推导长度
    c := [...]int{9, 7, 1, 5}
    fmt.Println("自动推导:", c)
    fmt.Println("长度:", len(c))

    // 5. 通过下标修改
    c[0] = 100
    fmt.Println("修改后:", c)

    // 6. 通过下标读取
    fmt.Println("c[0]:", c[0])
    fmt.Println("c[1]:", c[1])
}

六、本讲小结

知识点 要点
数组声明 var a [N]类型 或 a := [N]类型{...}
零值初始化 声明后所有元素自动初始化为类型零值
下标访问 从0开始,到 len-1 结束
len() 返回数组元素个数
... 推导 [...]类型{值...} 自动推导长度,仅限数组
数组 vs 切片 数组长度固定,切片长度可变

七、课后练习

  1. 声明一个长度为5的 int 数组,不初始化,打印观察零值
  2. 声明一个 string 数组,包含3个名字,用 ... 推导长度
  3. 声明一个 float64 数组,通过下标修改第2个元素的值
  4. 使用 len() 函数获取数组长度并打印
  5. 尝试访问超出数组长度的下标(如长度为3的数组访问 a[5]),观察报错信息