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语言的循环设计简洁而强大,掌握这些循环技巧能够帮助你编写更加高效和优雅的代码