Golang的循环语句

Go语言提供了强大且灵活的循环语句,与其他编程语言相比,Go只有for循环这一种形式,但它可以演变出多种用法。本文将详细介绍Go中的循环语句,包括四种不同的for循环用法以及goto语句的使用

1. 基本for循环(类似C/C++风格)

这是最经典的for循环写法,包含初始化语句、条件判断和循环后处理

语法结构

go 复制代码
for 初始化语句; 条件表达式; 循环后处理 {
    // 循环体
}

示例代码

go 复制代码
for i := 0; i <= 5; i++ {
    fmt.Printf("循环%d次\n", i)
}

输出:

复制代码
循环0次
循环1次
循环2次
循环3次
循环4次
循环5次

2. while风格的for循环

Go语言没有单独的while关键字,但可以使用for来实现while的功能

语法结构

go 复制代码
for 条件表达式 {
    // 循环体
}

示例代码

go 复制代码
sum := 1
for sum <= 10 {
    sum += sum
    fmt.Printf("sum = %d\n", sum)
}

输出:

复制代码
sum = 2
sum = 4
sum = 8
sum = 16

3. 无限循环

省略所有循环条件,创建一个无限循环。通常与break语句配合使用

语法结构

go 复制代码
for {
    // 无限循环体
}

示例代码

go 复制代码
for {
	fmt.Println("无限循环")
}

注意: 无限循环会一直执行,建议在实际使用中加入退出条件

4. range风格的for循环

使用range关键字可以遍历数组、切片、字符串、map或通道(channel)

语法结构

go 复制代码
for key, value := range 集合 {
    // 循环体
}

示例代码

go 复制代码
a := make(map[string]int)
a["小明"] = 90
a["小红"] = 80
a["小华"] = 70

// 遍历键和值
for key, value := range a {
    fmt.Printf("%s:%d\n", key, value)
}

// 只遍历值(忽略键)
for _, value := range a {
    fmt.Printf("%d\n", value)
}

输出:

复制代码
小明:90
小红:80
小华:70
90
80
70

5. 循环控制语句

break 语句

立即终止整个循环,跳出循环体

continue 语句

跳过当前循环的剩余代码,进入下一次循环迭代

示例代码

go 复制代码
// break示例
for i := 0; i < 10; i++ {
    if i == 5 {
        break  // i=5时终止循环
    }
    fmt.Printf("%d ", i)
}
// 输出:0 1 2 3 4

// continue示例
for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue  // 跳过偶数
    }
    fmt.Printf("%d ", i)
}
// 输出:1 3 5 7 9

6. 循环嵌套

可以在循环内部再嵌套循环,实现多维遍历

示例代码

go 复制代码
for i := 1; i <= 3; i++ {
    for j := 1; j <= 3; j++ {
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

输出:

复制代码
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
i=3, j=1
i=3, j=2
i=3, j=3

7. goto语句

goto语句允许程序无条件跳转到同一函数内的标记位置。虽然goto在结构化编程中不太推荐使用,但在某些特定场景下(如多层循环退出、错误处理)可以简化代码

语法结构

go 复制代码
goto 标签名
...
标签名: 语句

使用场景示例

场景一:跳出多层循环
go 复制代码
package main

import "fmt"

func main() {
    // 使用goto跳出多层循环
    for i := 0; i < 5; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 && j == 2 {
                goto end  // 直接跳转到end标签
            }
            fmt.Printf("i=%d, j=%d\n", i, j)
        }
    }
end:
    fmt.Println("跳出所有循环")
}

输出(部分):

复制代码
i=0, j=0
i=0, j=1
...
i=2, j=1
跳出所有循环
场景二:统一错误处理
go 复制代码
package main

import "fmt"

func main() {
    result, err := processData()
    if err != nil {
        goto errorHandler
    }
    fmt.Println("处理结果:", result)
    return

errorHandler:
    fmt.Println("错误处理:", err)
}

func processData() (string, error) {
    // 模拟处理逻辑
    return "", fmt.Errorf("数据异常")
}

goto使用注意事项

注意事项 说明
作用域限制 不能跳转到其他函数内部的标签
变量声明 跳转不能跳过变量的声明语句
可读性 过度使用会降低代码可读性
推荐场景 仅用于多层循环跳出和统一错误处理

goto的替代方案

大多数情况下,以下方式可以替代goto:

go 复制代码
// 使用标志变量跳出多层循环
func withFlag() {
    done := false
    for i := 0; i < 5 && !done; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 && j == 2 {
                done = true
                break
            }
        }
    }
}

// 使用函数return
func withReturn() {
    var process func(int, int) bool
    process = func(i, j int) bool {
        if i == 2 && j == 2 {
            return false
        }
        return true
    }
    // 省略循环逻辑
}

循环语句总结

循环类型 语法形式 适用场景
基本for for i:=0; i<n; i++ 已知迭代次数
while风格 for 条件 条件成立时循环
无限循环 for {} 需要手动退出
range遍历 for k,v := range coll 遍历集合类型
循环控制 break/continue 改变循环流程
goto跳转 goto label 特殊情况跳转

Go语言的循环设计简洁而强大,掌握这些循环技巧能够帮助你编写更加高效和优雅的代码

相关推荐
绍磊leo1 小时前
Go 实现类似 FastAPI 的后端服务:从入门到实战
开发语言·golang
一条泥憨鱼1 小时前
Java网络编程:Socket通信从入门到起飞
java·开发语言·网络·网络编程
磊 子1 小时前
STL算法库讲解1
开发语言·c++·算法
Hiter_John1 小时前
Golang的条件判断
服务器·开发语言·golang
8Qi81 小时前
LeetCode 474:一和零(Ones and Zeroes)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
27669582921 小时前
谷歌google cookie逆向角度分析
开发语言·python·google·sgss·谷歌搜索·sg-ss·谷歌cookie逆向
stolentime1 小时前
CF2066D2 Club of Young Aircraft Builders (hard version)题解
c++·算法·动态规划·组合数学
时寒的笔记1 小时前
瑞数案例欧冶解读py和js文件最终版
开发语言·javascript·ecmascript
zmzb01031 小时前
Python课后习题训练记录Day123
开发语言·python