Skip to content
Source Code

范围(Range)

range可以迭代各种数据结构中的元素。让我们看看如何在一些我们已经学过的数据结构中使用range

range iterates over elements in a variety of data structures. Let’s see how to use range with some of the data structures we’ve already learned.

在这里,我们使用range来对切片中的数字进行求和。数组的工作原理也是如此。

Here we use range to sum the numbers in a slice. Arrays work like this too.

go
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for _, num := range nums {
		sum += num
	}
	fmt.Println("sum:", sum)
	// sum: 9
}
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for _, num := range nums {
		sum += num
	}
	fmt.Println("sum:", sum)
	// sum: 9
}
对于数组和切片,range提供了每个条目的索引和值。在上面的例子中,我们不需要索引,所以用空白标识符_来忽略它。但有时我们确实需要索引。

range on arrays and slices provides both the index and value for each entry. Above we didn’t need the index, so we ignored it with the blank identifier _. Sometimes we actually want the indexes though.

go
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	
  // 省略重复代码...

	for i, num := range nums { 
		if num == 3 {
			fmt.Println("index:", i)
			//	index: 1
		}
	}
}
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	
  // 省略重复代码...

	for i, num := range nums { 
		if num == 3 {
			fmt.Println("index:", i)
			//	index: 1
		}
	}
}
对于映射,range会迭代键/值对。

range on map iterates over key/value pairs.

go
package main

import "fmt"

func main() {

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}
	// a => apple
	// b => banana
}
package main

import "fmt"

func main() {

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}
	// a => apple
	// b => banana
}
range还可以迭代映射的键。

range can also iterate over just the keys of a map.

go
package main

import "fmt"

func main() {

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}
	// a => apple
	// b => banana

	for k := range kvs { 
		fmt.Println("key:", k)
	}
	// key: a
	// key: b

}
package main

import "fmt"

func main() {

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}
	// a => apple
	// b => banana

	for k := range kvs { 
		fmt.Println("key:", k)
	}
	// key: a
	// key: b

}
对于字符串,range会迭代Unicode码点。第一个值是rune的起始字节索引,第二个值是rune本身。有关详细信息,请参阅字符串和rune

range on strings iterates over Unicode code points. The first value is the starting byte index of the rune and the second the rune itself. See Strings and Runes for more details.

go
package main

import "fmt"

func main() {
	for i, c := range "go" {
		fmt.Println(i, c)
	}
	// 0 103
	// 1 111
}
package main

import "fmt"

func main() {
	for i, c := range "go" {
		fmt.Println(i, c)
	}
	// 0 103
	// 1 111
}

运行

go
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for _, num := range nums {
		sum += num
	}
	fmt.Println("sum:", sum)

	for i, num := range nums {
		if num == 3 {
			fmt.Println("index:", i)
		}
	}

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}

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

	for i, c := range "go" {
		fmt.Println(i, c)
	}
}
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for _, num := range nums {
		sum += num
	}
	fmt.Println("sum:", sum)

	for i, num := range nums {
		if num == 3 {
			fmt.Println("index:", i)
		}
	}

	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s => %s\n", k, v)
	}

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

	for i, c := range "go" {
		fmt.Println(i, c)
	}
}
bash
go run 11-range.go
# sum: 9
# index: 1
# a => apple
# b => banana
# key: a
# key: b
# 0 103
# 1 111
go run 11-range.go
# sum: 9
# index: 1
# a => apple
# b => banana
# key: a
# key: b
# 0 103
# 1 111

Released under the MIT License.