在 Go 语言中,range
关键字用于遍历数组、切片、字符串、映射(map)以及通道(channel)。它提供了一种简洁的方式来迭代这些数据结构中的元素。下面是几种常见用例:
遍历数组或切片
当你使用 range
遍历数组或切片时,每次迭代都会返回两个值:索引和对应的值。
package main
import "fmt"
func main() {
nums := []int{
2, 3, 4}
for i, num := range nums {
fmt.Printf("Index: %d, Value: %d\n", i, num)
}
}
如果不需要索引,可以通过下划线 _
来忽略索引变量:
for _, num := range nums {
fmt.Println(num)
}
遍历字符串
当遍历字符串时,range
会解码每个 Unicode 码点,并返回字符的位置和该码点的值。
package main
import "fmt"
func main() {
str := "hello"
for i, c := range str {
fmt.Printf("Index: %d, Char: %c, Rune: %U\n", i, c, c)
}
}
注意这里的 i
是字符的字节位置,而不是字符的逻辑索引,因为一个字符可能由多个字节组成。
遍历映射
对于映射,range
返回的是键和对应的值。
package main
import "fmt"
func main() {
m := map[string]int{
"apple": 5, "banana": 6, "cherry": 7}
for k, v := range m {
fmt.Printf("Key: %s, Value: %d\n", k, v)
}
}
同样地,如果你只关心键或者值,可以使用下划线来忽略不使用的部分:
for k := range m {
fmt.Println(k) // 只打印键
}
遍历通道
range
也可以用来从通道接收数据直到通道关闭。
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch) // 关闭通道很重要,否则 range 会一直等待
for n := range ch {
fmt.Println(n)
}
}
以上就是 range
在 Go 语言中的基本用法。记住,当你使用 range
与通道时,确保通道最终会被关闭,这样 range
循环才能正常结束。