Go 语言循环语句(Loop Statements)详解
在 Go 语言中,循环语句用于执行重复操作。Go 语言提供了 for 关键字实现循环结构,并且支持以下三种循环类型:
- 标准
for循环(类 C 语言的for语法) for作为while循环- 无限循环
for range循环(用于遍历数组、切片、映射、字符串、通道)
1. for 循环(标准格式)
1.1 语法
for 初始化语句; 条件表达式; 递增/递减语句 {
// 代码块
}
- 初始化语句:只执行一次,通常用于变量初始化。
- 条件表达式:每次循环开始前进行条件判断,
true继续执行,false终止循环。 - 递增/递减语句:每次循环结束后执行,用于控制循环变量的变化。
1.2 示例
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
fmt.Println("当前值:", i)
}
}
输出:
当前值: 1
当前值: 2
当前值: 3
当前值: 4
当前值: 5
2. for 作为 while 循环
Go 语言没有 while 关键字,但可以使用 for 实现 while 循环的效果。
2.1 语法
for 条件表达式 {
// 代码块
}
- 省略了初始化和递增/递减部分,循环仅受条件控制。
2.2 示例
package main
import "fmt"
func main() {
count := 0
for count < 5 {
fmt.Println("计数:", count)
count++
}
}
输出:
计数: 0
计数: 1
计数: 2
计数: 3
计数: 4
3. 无限循环
for 循环如果没有指定条件表达式,就会变成无限循环。
3.1 语法
for {
// 代码块
}
- 这种循环不会自动停止,只能通过
break语句终止。
3.2 示例
package main
import "fmt"
func main() {
count := 0
for {
fmt.Println("循环执行:", count)
count++
if count >= 3 {
break // 终止循环
}
}
}
输出:
循环执行: 0
循环执行: 1
循环执行: 2
4. for range 循环(遍历集合)
for range 语句用于遍历数组、切片、映射(map)、字符串、通道(channel)。
4.1 遍历数组和切片
package main
import "fmt"
func main() {
nums := []int{10, 20, 30, 40}
for index, value := range nums {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
}
输出:
索引: 0, 值: 10
索引: 1, 值: 20
索引: 2, 值: 30
索引: 3, 值: 40
index:索引value:对应索引的值
如果不需要索引,可以用 _ 代替:
for _, value := range nums {
fmt.Println(value)
}
4.2 遍历字符串
遍历字符串时,for range 返回的是索引和Unicode 码点(rune 类型)。
package main
import "fmt"
func main() {
str := "Go语言"
for index, char := range str {
fmt.Printf("索引: %d, 字符: %c\n", index, char)
}
}
输出:
索引: 0, 字符: G
索引: 1, 字符: o
索引: 2, 字符: 语
索引: 5, 字符: 言
注意:
- 中文字符占多个字节,因此某些索引值不是连续的。
4.3 遍历 map(键值对)
package main
import "fmt"
func main() {
scores := map[string]int{"Alice": 90, "Bob": 85, "Charlie": 95}
for name, score := range scores {
fmt.Printf("姓名: %s, 分数: %d\n", name, score)
}
}
输出:
姓名: Alice, 分数: 90
姓名: Bob, 分数: 85
姓名: Charlie, 分数: 95
如果只想遍历 map 的键:
for key := range scores {
fmt.Println("键:", key)
}
4.4 遍历 channel
package main
import "fmt"
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
ch <- 30
close(ch) // 关闭通道
for num := range ch {
fmt.Println("接收:", num)
}
}
输出:
接收: 10
接收: 20
接收: 30
range用于遍历channel时,通道必须关闭,否则会死锁。
5. break 语句(终止循环)
break 用于提前终止循环,跳出当前循环体。
示例
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i > 5 {
break
}
fmt.Println("值:", i)
}
}
输出:
值: 1
值: 2
值: 3
值: 4
值: 5
6. continue 语句(跳过本次循环)
continue 用于跳过本次循环的剩余部分,直接进入下一次循环。
示例
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
if i == 3 {
continue
}
fmt.Println("值:", i)
}
}
输出:
值: 1
值: 2
值: 4
值: 5
注意: continue 跳过 i == 3 的执行。
7. 总结
| 语句 | 作用 |
|---|---|
for | 标准循环 |
for (作为 while) | 只有条件表达式的循环 |
for {} | 无限循环 |
for range | 遍历集合(数组、切片、map、字符串、channel) |
break | 终止当前循环 |
continue | 跳过本次循环,进入下一次 |