Go 语言中的 range
在线程不安全的 map 中我们学习了 map 的遍历,里面使用了一个叫 range 的关键字来对 map 进行遍历操作。当时还提到了切片和数组都可以使用这个方法遍历。本文就来详细学习一下 range 关键字的用法。
Tips:本文提及的 map 均是线程不安全的 map。线程安全的 map 及其遍历方法参照 Go 语言中的map 一文。
1. 基本用法
range 可以用来遍历的对象有数组、切片、map、字符串以及通道。遍历的对象不同,range 的返回值也会有所不同。遍历数组、切片和字符串时,它返回的就是数据的索引和值。遍历map时返回的就是map的key和value。而遍历通道时则只返回通道中的数据。
代码示例:
代码块
- 1
package main - 2
- 3
import ( - 4
"fmt" - 5
) - 6
- 7
func main() { - 8
str := "Codey" - 9
intArray := [5]int{1, 2, 3, 4, 5} - 10
intSlice := []int{1, 2, 3, 4, 5} - 11
m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"} - 12
c := make(chan int, 10) - 13
c <- 10 - 14
c <- 11 - 15
c <- 12 - 16
c <- 13 - 17
c <- 14 - 18
fmt.Println("---字符串的遍历---") - 19
//遍历字符串 - 20
for k, v := range str { - 21
fmt.Printf("索引:%d,值:%cn", k, v) - 22
} - 23
fmt.Println("---数组的遍历---") - 24
//遍历数组 - 25
for k, v := range intArray { - 26
fmt.Printf("索引:%d,值:%dn", k, v) - 27
} - 28
fmt.Println("---切片的遍历---") - 29
//遍历切片 - 30
for k, v := range intSlice { - 31
fmt.Printf("索引:%d,值:%dn", k, v) - 32
} - 33
fmt.Println("---map的遍历---") - 34
//遍历map - 35
for k, v := range m { - 36
fmt.Printf("key:%s,value:%sn", k, v) - 37
} - 38
fmt.Println("---通道的遍历---") - 39
//遍历通道 - 40
for v := range c { - 41
fmt.Printf("值:%dn", v) - 42
if len(c) == 0 { - 43
break - 44
} - 45
} - 46
}
执行结果:

若是在开发过程中只想用到遍历对象的索引或者值,比如说一个map以汽车的车牌号为key存储了一些汽车的信息,但是你只想要操作车牌号。可以使用_来接收不需要使用的值。如果是只想用索引的话,可以直接只用一个参数接收遍历对象传出的值,默认只会接收索引。
代码示例:
代码块
- 1
package main - 2
- 3
import ( - 4
"fmt" - 5
) - 6
- 7
func main() { - 8
- 9
m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"} - 10
fmt.Println("---map的key值---") - 11
//只取key - 12
for k := range m { - 13
fmt.Printf("key:%sn", k) - 14
} - 15
fmt.Println("---map的value值---") - 16
//只取value - 17
for _, v := range m { - 18
fmt.Printf("value:%sn", v) - 19
} - 20
}
执行结果:

2. 注意事项
在使用 range 的时候需要注意,我们无法通过range输出的值来修改遍历的对象,因为range相当于声明了两个变量,这两个变量逐一复制了遍历对象中的值,归根结底还是因为 Go 语言只有值传递,没有引用传递。
代码示例:
代码块
- 1
package main - 2
- 3
import ( - 4
"fmt" - 5
) - 6
- 7
func main() { - 8
- 9
intSlice := []int{1, 2, 3, 4, 5} - 10
- 11
//遍历切片 - 12
for k, v := range intSlice { - 13
fmt.Printf("索引:%d,索引地址:%pn", k, &k) - 14
fmt.Printf("值:%d,值地址:%pn", v, &v) - 15
} - 16
}
执行结果:

3. 小结
本文主要介绍了 Go 语言中 range 关键字的用法,Go语言中可以 range 的对象有:字符串、数组、切片、map 和通道。其中用于接收 range 出来的值的变量是一个/两个不断被赋值的变量,所以这些变量的修改无法影响到正在被遍历的对象本身。
文章来源于网络,侵删!
