第十四回:Go 语言数组

排排坐,吃果果(固定长度数组)
华夫人
华夫人: 华府的家丁宿舍,每个房间住几个人都是定死的!这就叫数组 (Array)。 一旦建好,不能多也不能少。而且记住,每个房间都是独立的,你把这个房间的人换了,不会影响那个房间(值拷贝)。

1. 🏠 固定床位 (数组定义)

数组是固定长度的序列。长度是类型的一部分,[5]int[10]int 是完全不同的两种东西,不能混用!

秋香
秋香: 华安,如果我也想住进来,但是房间已经满了(5个人),能加个床位吗?
唐伯虎
唐伯虎: 秋香姐,数组这房子是死的,建好是多大就是多大,加不了!不过别急,下一回我带你去看切片 (Slice),那是可以自动扩建的豪宅!
var a [5]int // 定义一个能装5个整数的数组,默认都是0
a[0] = 9527  // 第一个位置坐9527
a[1] = 9528

花式初始化:

// 1. 指定所有元素
b := [3]string{"秋香", "冬香", "石榴姐"}

// 2. 让编译器数数 (...)
c := [...]int{1, 2, 3, 4, 5, 6, 7}
fmt.Println(len(c)) // 输出 7

// 3. 指定特定索引的值
d := [5]int{1: 10, 3: 20} // 索引1是10,索引3是20,其他是0
// [0 10 0 20 0]

2. 👯‍♂️ 影分身之术 (值类型特性 - 重要!)

在 Go 语言中,数组是值类型。这意味着当你把数组赋值给另一个变量,或者传给函数时,会完整拷贝一份。

唐伯虎
唐伯虎: 这就像我抄了一份《唐寅诗集》送给秋香。她在副本上乱涂乱画,不会影响我手里原本的内容。
func change(arr [3]int) {
    arr[0] = 888 // 这里的 arr 只是个副本
    fmt.Println("函数里:", arr) // [888 2 3]
}

func main() {
    a := [3]int{1, 2, 3}
    change(a)
    fmt.Println("函数外:", a) // [1 2 3] -> 没变!
}

3. 🏢 楼上楼下 (多维数组)

数组里还可以装数组,这就是多维数组。

// 2行3列的二维数组
var grid [2][3]int
grid[0][1] = 5
// [[0 5 0] [0 0 0]]

🎯 练功房(查房)

创建一个长度为 3 的整数数组,分别存入 1, 2, 3。

package main
import "fmt"

func main() {
    // 填空:定义并初始化数组
    var arr ______ = [3]int{1, 2, 3}
    fmt.Println(arr)
}

任务: 变量类型应该写什么?

答案: [3]int

注意:长度 3 必须写在括号里。