go 语言中range关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对.

  • range 变量

    大多数人都知道在range子句的左边(在上面的例子中的i)你可以使用以下命令分配循环变量: – 赋值(=) – 短变量声明(:=) 你也可以选择不做任何事情来完全忽略循环变量。 如果使用短变量声明(:=),Go将为循环的每次迭代重用变量(仅在循环的范围内)

  • range 表达式

    在range子句的右侧(在下面的示例中array),你可以找到他们称之为range表达式的内容。它可以包含任何计算结果为以下之一的表达式: – array – pointer to an array – slice – string – map – channels that allow receiving, e.g. chan int or chan<- int

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"

func main() {
	array := [3]int{1, 2, 3}
	slice := []int{10, 11, 12, 13}
	kvs := map[string]string{"a": "A", "b": "B", "c": "C"}
	for i, v := range array {
		fmt.Println(i, v)
	}

	for i, v := range slice {
		fmt.Println(i, v)
	}

	for k, v := range kvs {
		fmt.Println(k, v)
	}
}

输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
0 1
1 2
2 3
*****************
0 10
1 11
2 12
3 13
*****************
a A
b B
c C

如果将for range 数组,切片和集合的v去掉,变成如下代码,range将分别返回对应数组和列表的索引,以及集合的键

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"

func main() {
	array := [3]int{1, 2, 3}
	slice := []int{10, 11, 12, 13}
	kvs := map[string]string{"a": "A", "b": "B", "c": "C"}
	for i := range array {
		fmt.Println(i)
	}

	for i := range slice {
		fmt.Println(i)
	}

	for k := range kvs {
		fmt.Println(k)
	}
}

输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
0
1
2
*****************
0
1
2
3
*****************
a
b
c