range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
for key, value := range oldMap {
newMap[key] = value
}
格式中的key和value是可以省略的。如果只想读取key,可以进行修改:
for key := range oldMap
for key, _ := range oldMap
(同理只读value)
for _, value := range oldMap
切片迭代
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
从i=0开始进行迭代,直到切片结束。这里的key是切片数据标号,value是切片数据。
结果展示:
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
map迭代
map迭代的起始节点是随机的,但是之后的是按照顺序的。
package main
import "fmt"
func main() {
map1 := make(map[int]float32)
map1[1] = 1.0
map1[2] = 2.0
map1[3] = 3.0
map1[4] = 4.0
// 读取 key 和 value
for key, value := range map1 {
fmt.Printf("key is: %d - value is: %f\n", key, value)
}
// 读取 key
for key := range map1 {
fmt.Printf("key is: %d\n", key)
}
// 读取 value
for _, value := range map1 {
fmt.Printf("value is: %f\n", value)
}
}
结果展示:
key is: 1 - value is: 1.000000
key is: 2 - value is: 2.000000
key is: 3 - value is: 3.000000
key is: 4 - value is: 4.000000
key is: 2
key is: 3
key is: 4
key is: 1
value is: 2.000000
value is: 3.000000
value is: 4.000000
value is: 1.000000
字符串迭代
package main
import "fmt"
func main() {
for key, value := range "string" {
fmt.Printf("key is: %d - value is: %c\n", key, value)
}
}
读字符串读的是ascii码,所以采用%c输出
结果展示:
key is: 0 - value is: s
key is: 1 - value is: t
key is: 2 - value is: r
key is: 3 - value is: i
key is: 4 - value is: n
key is: 5 - value is: g
channel
package main
import "fmt"
func main() {
ch := make(chan int, 10)
ch <- 11
ch <- 12
close(ch)
for x := range ch {
fmt.Println(x)
}
}
结果展示:
11
12