Go 数组学习笔记
1. 数组声明与初始化
Go 数组是固定长度、同类型元素的序列。长度是数组类型的一部分:
go
package main
import "fmt"
func main() {
// 声明数组:var 名称 [长度]类型 --- 元素自动为零值
var numbers [5]int // 5个int,全部为0
// 数组字面量初始化:[长度]类型{值1, 值2, ...}
colors := [3]string{"red", "green", "blue"}
// ... 让 Go 自动计算长度
days := [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
// 通过索引访问和修改元素
numbers[2] = 42 // 修改第3个元素(索引2)
// len() 获取数组长度
fmt.Println("Length of colors array:", len(colors))
// 打印整个数组
fmt.Println("Numbers:", numbers)
fmt.Println("Colors:", colors)
fmt.Println("Days:", days)
}
执行结果:
Length of colors array: 3
Numbers: [0 0 42 0 0]
Colors: [red green blue]
Days: [Monday Tuesday Wednesday Thursday Friday]
要点:
-
var numbers [5]int--- 声明5个int的数组,所有元素自动为0(int的零值) -
[3]string{"red", "green", "blue"}--- 用字面量初始化,长度必须与元素数量一致 -
[...]string{...}---...让编译器根据初始化值自动计算长度(此处为5) -
numbers[2] = 42--- 通过索引修改元素,索引从 0 开始 -
len(colors)--- 返回数组长度,此处为 3 -
数组输出格式:
[elem1 elem2 elem3],元素之间用空格分隔 -
关键概念 :长度是数组类型的一部分!
[3]int和[5]int是不同类型 ,不能互相赋值:govar a [3]int var b [5]int a = b // 编译报错:cannot use b (type [5]int) as type [3]int
2. 传统 for 循环遍历数组
用 for i := 0; i < len(arr); i++ 按索引遍历:
go
package main
import "fmt"
func main() {
scores := [5]int{85, 92, 78, 96, 88}
// 传统 for 循环:通过索引访问每个元素
fmt.Println("Scores using traditional for loop:")
for i := 0; i < len(scores); i++ {
fmt.Printf("Score %d: %d\n", i+1, scores[i])
}
}
执行结果:
Scores using traditional for loop:
Score 1: 85
Score 2: 92
Score 3: 78
Score 4: 96
Score 5: 88
要点:
for i := 0; i < len(scores); i++--- 从索引0遍历到最后一个元素scores[i]--- 通过索引访问当前元素i+1--- 索号从0开始,显示时加1变为序号(第1个、第2个...)- 适用场景:需要索引做计算、修改元素、或从特定位置开始遍历
- Go 的
len()是编译时确定的(数组长度固定),不需要运行时计算
3. range 遍历数组 --- 索引 + 值
for index, value := range arr 同时获取索引和值:
go
package main
import "fmt"
func main() {
names := [...]string{"Alice", "Bob", "Charlie", "Diana", "Eve"}
// range 同时返回索引和值
fmt.Println("Names with indices using range:")
for index, value := range names {
fmt.Printf("Index %d: %s\n", index, value)
}
}
执行结果:
Names with indices using range:
Index 0: Alice
Index 1: Bob
Index 2: Charlie
Index 3: Diana
Index 4: Eve
要点:
-
for index, value := range names--- index 是索引,value 是元素的拷贝 -
range 是遍历数组/切片最常用的方式,比传统 for 更简洁
-
注意:
value是元素的拷贝 ,修改 value 不影响原数组:gofor i, v := range scores { v = 0 // 只修改了拷贝,scores 不变! } // 要修改原数组,必须用索引:scores[i] = 0
4. range 只取值 --- 用 _ 忽略索引
不需要索引时,用 _ 忽略:
go
package main
import "fmt"
func main() {
scores := [5]int{85, 92, 78, 96, 88}
// 只取值,忽略索引
fmt.Println("Scores using range (values only):")
for _, value := range scores {
fmt.Printf("Score: %d\n", value)
}
}
执行结果:
Scores using range (values only):
Score: 85
Score: 92
Score: 78
Score: 96
Score: 88
要点:
for _, value := range scores---_忽略索引,只获取元素值- 如果只写
for value := range scores,value 是索引而不是元素值(Go 的默认行为) - 必须写
_, value才能获取元素值
5. 遍历计算 --- 求最大值和平均值
实际应用中,遍历数组做统计计算是最常见的需求:
go
package main
import "fmt"
func main() {
scores := [5]int{85, 92, 78, 96, 88}
// 求最大值:从第一个元素开始,逐个比较
maxScore := scores[0]
for i := 1; i < len(scores); i++ {
if scores[i] > maxScore {
maxScore = scores[i]
}
}
fmt.Println("Maximum score:", maxScore)
// 求平均值:先求和,再除以长度
var sum int
for _, score := range scores {
sum += score
}
average := float64(sum) / float64(len(scores))
fmt.Printf("Average score: %.2f\n", average)
}
执行结果:
Maximum score: 96
Average score: 87.80
要点:
- 求最大值:用传统 for 循环(从索引1开始,与 scores0 比较),需要索引访问
- 求和:用 range 只取值(不需要索引),
sum += score累加 - 类型转换 :
float64(sum) / float64(len(scores))--- int 除 int 得 int(87),必须转 float64 才能得到小数(87.80) %.2f--- 格式化为2位小数- 求最大值从
scores[0]开始(不从0开始),这样空数组时不会越界 - Go 中求平均值的类型转换是常见模式:
float64(总和) / float64(数量)
知识点总结
| 知识点 | 关键概念 |
|---|---|
| 数组声明 | var arr [N]T 零值初始化,[N]T{...} 字面量,[...]T{...} 自动长度 |
| 长度是类型的一部分 | [3]int 和 [5]int 是不同类型,不能互相赋值 |
| 索引访问 | arr[0] 到 arr[len-1],索引从0开始 |
| 传统 for 遍历 | for i := 0; i < len(arr); i++ --- 需要索引修改元素时使用 |
| range 遍历 | for i, v := range arr --- v 是元素拷贝,修改 v 不影响原数组 |
| range 只取值 | for _, v := range arr --- 忽略索引;单变量 for v := range 中 v 是索引 |
| 统计计算 | 求最大值用传统 for,求和用 range,求平均需 float64 类型转换 |