返回

Go 语言 range 关键字概述:简洁灵活的遍历利器

后端

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 关键字的用法,您可以显著提高代码的可读性和可维护性,并编写出更简洁高效的程序。