【Go 从入门到精通】第 5 章:数组与切片(slice)

【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 切片是什么

切片可以理解成数组的一个「窗口」

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phpgolife

谢谢您的支持,您是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值