循环与迭代
在 Go 语言中,循环和迭代是通过 for 语句实现的。Go 语言只有一种循环结构,就是 for 循环,但它可以灵活地用来实现不同的循环和迭代行为。
Go 中的 for 循环
| 形式 | 描述 | 示例 |
|---|---|---|
| 标准循环 | 使用初始条件、循环条件和后续操作。 | for i := 0; i < 5; i++ { fmt.Println(i) } |
| 条件循环 | 只有循环条件,初始条件和后续操作可以省略。 | i := 0; for i < 5 { fmt.Println(i); i++ } |
| 无限循环 | 只使用 for,没有条件,相当于无限循环。 | for { fmt.Println("infinite loop") } |
| 迭代数组或切片 | 通过 range 迭代数组或切片,返回索引和值。 | for i, v := range arr { fmt.Println(i, v) } |
| 迭代字符串 | range 也可以用于字符串,返回索引和字符的 Unicode 代码点。 | for i, v := range str { fmt.Println(i, v) } |
| 迭代映射 | 通过 range 迭代映射,返回键和值。 | for k, v := range myMap { fmt.Println(k, v) } |
| 迭代通道 | range 也用于通道,返回从通道接收到的值。 | for v := range ch { fmt.Println(v) } |
各种循环形式的示例
1. 标准循环
go
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i) // 输出 0, 1, 2, 3, 4
}
}2. 条件循环
go
package main
import "fmt"
func main() {
i := 0
for i < 5 {
fmt.Println(i) // 输出 0, 1, 2, 3, 4
i++
}
}3. 无限循环
go
package main
import "fmt"
func main() {
for {
fmt.Println("This is an infinite loop") // 不断输出
}
}4. 迭代数组或切片
go
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
for i, v := range arr {
fmt.Printf("Index: %d, Value: %d\n", i, v)
}
}5. 迭代字符串
go
package main
import "fmt"
func main() {
str := "hello"
for i, v := range str {
fmt.Printf("Index: %d, Rune: %c\n", i, v)
}
}6. 迭代映射
go
package main
import "fmt"
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
for k, v := range myMap {
fmt.Printf("Key: %s, Value: %d\n", k, v)
}
}7. 迭代通道
go
package main
import "fmt"
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
for v := range ch {
fmt.Println(v) // 输出 1, 2, 3
}
}关键点总结
for是唯一的循环结构,它既可以用来做传统的计数循环,也可以用来做条件循环或无限循环。range关键字非常强大,可以用于数组、切片、映射、通道和字符串的迭代。- 无限循环:
for语句没有条件时会成为无限循环,常用于需要持续运行的场景(例如监听事件、处理任务等)。 - 迭代结构:对于数组、切片、映射等数据结构,使用
range来简化迭代操作。
Go 的 for 循环非常灵活,几乎可以实现所有类型的迭代需求,具有简单且强大的控制结构。