【Go 从入门到精通】第 5 章:数组与切片(slice)
上一章我们学会了运算符和流程控制,代码已经「会思考、会循环」了。但程序要处理的数据往往是一堆一堆的,比如全班 50 个学生的成绩、购物车里 10 件商品。这一章就来讲 Go 存放「一组数据」的两大类型:数组和切片。
切片是 Go 里最最常用的类型,没有之一。它也是新手最容易踩坑的地方——「改了 A 结果 B 也跟着变」「append 之后原数据怎么没变」。这一章把这些坑一次讲透。
一、数组:固定长度的「一排盒子」
1.1 什么是数组
数组是一段长度固定、类型相同的连续内存,像一排编号的盒子:
var scores [5]int // 声明一个能装 5 个 int 的数组,元素都是零值 0
用下标(从 0 开始)访问和修改:
scores[0] = 90
scores[1] = 80
fmt.Println(scores[0]) // 90
fmt.Println(scores) // [90 80 0 0 0]
1.2 数组的三种声明方式
// 方式一:先声明再赋值
var a [3]int
a[0] = 1
// 方式二:声明时给初始值
b := [3]int{
1, 2, 3}
// 方式三:用 ... 让编译器自动数长度
c := [...]int{
1, 2, 3, 4, 5} // c 是 [5]int
💡
[...]int的...表示「长度你自己数」,不是能写任意多个——长度一旦确定就固定了。
1.3 数组长度是类型的一部分
这是数组最反直觉的一点:[3]int 和 [4]int 是两种不同的类型,不能互相赋值:
var a [3]int
var b [4]int
a = b // ❌ 编译错误:类型不同,不能赋值
所以数组的长度在编译时就固定死了,想动态扩容——办不到。这正是切片诞生的原因。
1.4 遍历数组
arr := [3]string{
"苹果", "香蕉", "橙子"}
// 方式一:传统 for + 下标
for i := 0; i < len(arr); i++ {
fmt.Println(i, arr[i])
}
// 方式二:for range(更常用)
for i, v := range arr {
fmt.Println(i, v)
}
💡
len(arr)返回数组长度。数组长度固定,所以len的结果也是固定的。
1.5 数组是「值类型」:赋值会整体拷贝
这一点要重点记住:数组变量赋值给另一个变量时,会复制一整份,两者互不影响:
a := [3]int{
1, 2, 3}
b := a // 完整复制一份
b[0] = 100
fmt.Println(a) // [1 2 3] ← a 不受影响
fmt.Println(b) // [100 2 3]
函数传参也一样,传进去的是副本,改副本不影响原数组。这在数组很大时会有性能开销,所以实际开发中数组用得少,切片用得多。
二、切片(slice):数组的「视图」
2.1 切片是什么
切片可以理解成数组的一个「窗口」

&spm=1001.2101.3001.5002&articleId=165491115&d=1&t=3&u=3a0d6e9491b44f47987f223b772de62e)
605

被折叠的 条评论
为什么被折叠?



