在Go语言中,range
是一个用于遍历各种数据结构(如数组、切片、字符串、map 和通道)的关键字。range
可以返回一个索引和值,或者是键和值,具体取决于你遍历的是什么类型的数据结构。
1. range
的用法
range
常用于 for
循环,来遍历集合中的元素。它可以遍历数组、切片、字符串、map
、甚至是 channel
(通道)。每次迭代,range
会返回两个值:第一个值是索引或键,第二个值是元素本身。
基本语法:
for index, value := range collection {
// 使用 index 和 value
}
如果你不需要索引或键,可以使用下划线 _
来忽略它们。
2. range
遍历数组和切片
使用 range
遍历数组和切片时,返回的第一个值是索引,第二个值是数组或切片中对应索引位置的元素值。
示例:
package main
import "fmt"
func main() {
nums := []int{2, 3, 4}
for index, value := range nums {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
}
输出:
Index: 0, Value: 2
Index: 1, Value: 3
Index: 2, Value: 4
如果你只关心数组或切片中的值,可以忽略索引:
for _, value := range nums {
fmt.Println(value)
}
3. range
遍历字符串
遍历字符串时,range
返回的是每个字符的索引和Unicode代码点(rune)。
示例:
package main
import "fmt"
func main() {
str := "hello"
for index, char := range str {
fmt.Printf("Index: %d, Character: %c\n", index, char)
}
}
输出:
Index: 0, Character: h
Index: 1, Character: e
Index: 2, Character: l
Index: 3, Character: l
Index: 4, Character: o
4. range
遍历 map
遍历 map
时,range
返回的第一个值是键,第二个值是键对应的值。
示例:
package main
import "fmt"
func main() {
fruits := map[string]string{"a": "apple", "b": "banana"}
for key, value := range fruits {
fmt.Printf("Key: %s, Value: %s\n", key, value)
}
}
输出:
Key: a, Value: apple
Key: b, Value: banana
5. range
遍历通道(channel)
range
也可以用于遍历通道,前提是该通道是关闭的,否则它会一直阻塞等待新数据。range
会从通道中接收数据,直到通道被关闭。
示例:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch) // 关闭通道
for value := range ch {
fmt.Println(value)
}
}
输出:
1
2
6. 忽略返回值
如果你只需要索引或键,或者只需要值,可以用下划线 _
忽略不需要的部分。例如:
for _, value := range nums { // 忽略索引,只关心值
fmt.Println(value)
}
for index := range nums { // 忽略值,只关心索引
fmt.Println(index)
}
7. range
遍历多维数组
range
也可以用于遍历多维数组或切片。每次遍历返回的是子数组或子切片。
示例:
package main
import "fmt"
func main() {
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
for _, row := range matrix {
for _, value := range row {
fmt.Printf("%d ", value)
}
fmt.Println()
}
}
输出:
1 2 3
4 5 6
7 8 9
8. 总结
range
是 Go 语言中用于遍历集合(数组、切片、map、字符串和通道)的关键字。- 它每次返回两个值:索引(或键) 和 值。你可以根据需要选择是否忽略某些返回值。
- 通过
range
,Go 提供了一种简单而强大的方式来遍历各种数据结构。