5.1 Go 数组学习笔记

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不同类型 ,不能互相赋值:

    go 复制代码
    var 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 不影响原数组:

    go 复制代码
    for 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 类型转换
相关推荐
互联网中的一颗神经元18 小时前
06. Small 对象分配:mcache 无锁路径
开发语言·golang
abcefg_h1 天前
MCP 实战指南:如何在项目中使用 Model Context Protocol 及其通信原理
开发语言·后端·golang·mcp
ylj_dev1 天前
从 0 构建 AI Workload Platform(四):从单机工作流内核到可靠控制面
docker·postgresql·架构·golang
FfHUCisI1 天前
Golang database/sql 标准库基础
数据库·sql·golang
北漂燕郊杨哥1 天前
CAD Mini Viewer —— 一个纯 Go 编写的轻量 DXF 查看器
golang·cad·dxf·cadview
xcLeigh1 天前
Go入门:基本数据类型全览与选择指南
android·服务器·golang·教程·go热门
圣殿骑士-Khtangc1 天前
Go分布式锁实现方案从Redis到etcd的完整对比
golang
聪明蛋子哟2 天前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust