Go 语言 range 关键字概述:简洁灵活的遍历利器
2023-11-07 14:15:31
range 的基本用法
range 关键字的基本语法如下:
for range {collection} {
// 循环体
}
其中,{collection} 可以是数组、切片、映射或通道等数据结构。range 关键字会遍历 {collection} 中的每个元素,并在每次迭代中将元素赋值给循环变量。
例如,以下代码使用 range 关键字遍历一个数组:
arr := []int{1, 2, 3, 4, 5}
for i, v := range arr {
fmt.Println(i, v)
}
输出结果为:
0 1
1 2
2 3
3 4
4 5
在这个例子中,range 关键字将数组 arr 中的每个元素依次赋值给循环变量 i 和 v,并在每次迭代中输出元素的索引和值。
range 关键字的高级用法
range 关键字除了基本用法之外,还有一些高级用法,可以帮助您处理更复杂的数据结构和实现更强大的功能。
遍历映射
range 关键字可以遍历映射的键值对,语法如下:
for k, v := range m {
// 循环体
}
其中,m 是一个映射,k 是键,v 是值。range 关键字会遍历 m 中的每个键值对,并在每次迭代中将键和值分别赋值给循环变量 k 和 v。
例如,以下代码使用 range 关键字遍历一个映射:
m := map[string]int{"Alice": 20, "Bob": 30, "Carol": 40}
for k, v := range m {
fmt.Println(k, v)
}
输出结果为:
Alice 20
Bob 30
Carol 40
遍历通道
range 关键字还可以遍历通道,语法如下:
for v := range c {
// 循环体
}
其中,c 是一个通道,v 是通道中的值。range 关键字会阻塞等待通道中出现值,并在每次出现值时将值赋值给循环变量 v。
例如,以下代码使用 range 关键字遍历一个通道:
c := make(chan int)
go func() {
for i := 0; i < 5; i++ {
c <- i
}
close(c)
}()
for v := range c {
fmt.Println(v)
}
输出结果为:
0
1
2
3
4
生成器
range 关键字还可以用于生成器,生成器是一种特殊类型的函数,可以返回一个值序列。生成器的语法如下:
func generator() chan T {
c := make(chan T)
go func() {
// 生成值序列并发送到通道 c
}()
return c
}
其中,T 是生成器返回的值类型。
例如,以下代码使用 range 关键字遍历一个生成器:
g := generator()
for v := range g {
fmt.Println(v)
}
输出结果为:
0
1
2
3
4
range 关键字在并发编程中的应用
range 关键字在并发编程中也有广泛的应用,特别是在处理通道和生成器时。
并发遍历通道
range 关键字可以并发遍历多个通道,语法如下:
for v := range c1, c2, ... {
// 循环体
}
其中,c1、c2、... 是多个通道。range 关键字会同时阻塞等待这些通道中出现值,并在出现值时将值赋值给循环变量 v。
例如,以下代码使用 range 关键字并发遍历两个通道:
c1 := make(chan int)
c2 := make(chan string)
go func() {
for i := 0; i < 5; i++ {
c1 <- i
}
close(c1)
}()
go func() {
for i := 'A'; i <= 'E'; i++ {
c2 <- string(i)
}
close(c2)
}()
for v := range c1, c2 {
fmt.Println(v)
}
输出结果为:
0
A
1
B
2
C
3
D
4
E
并发生成器
range 关键字还可以并发遍历多个生成器,语法如下:
for v := range g1, g2, ... {
// 循环体
}
其中,g1、g2、... 是多个生成器。range 关键字会同时阻塞等待这些生成器生成值,并在生成值时将值赋值给循环变量 v。
例如,以下代码使用 range 关键字并发遍历两个生成器:
g1 := generator()
g2 := generator()
for v := range g1, g2 {
fmt.Println(v)
}
输出结果为:
0
0
1
1
2
2
3
3
4
4
总结
range 关键字是 Go 语言中一个非常强大的工具,它可以帮助您轻松遍历各种数据结构,实现复杂的逻辑。通过掌握 range 关键字的用法,您可以显著提高代码的可读性和可维护性,并编写出更简洁高效的程序。