for range 用来遍历容器类数据类型的变量:数组、切片、映射、通道。
for range在遍历开始时创建一个或两个变量(:=左边变量),每次将容器数据的值拷贝至已创建好的变量中。在遍历过程中,接收拷贝值的变量地址不变,但是值会每次替换成当前容器变量的最新值。
#map for range
package main
import (
"fmt"
)
func main() {
s := map[string]int{"a": 1, "b": 2, "c": 3}
for k, v := range s {
fmt.Println(&k, k, &v, v)
}
}
输出:
0xc000010200 a 0xc000014078 1
0xc000010200 b 0xc000014078 2
0xc000010200 c 0xc000014078 3
#slice for range
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
for k, v := range s {
fmt.Println(&k, k, &v, v)
}
}
输出:
0xc0000b4008 0 0xc0000b4010 1
0xc0000b4008 1 0xc0000b4010 2
0xc0000b4008 2 0xc0000b4010 3
#array for range
package main
import (
"fmt"
)
func main() {
s := [3]int{1, 2, 3}
for k, v := range s {
fmt.Println(&k, k, &v, v)
}
}
输出:
0xc0000b4008 0 0xc0000b4010 1
0xc0000b4008 1 0xc0000b4010 2
0xc0000b4008 2 0xc0000b4010 3
#chan go range
package main
import "fmt"
func main() {
c := make(chan int)
go func() {
defer close(c)
for i := 0; i < 3; i++ {
c <- i
}
}()
for v := range c {
fmt.Println(&v, v)
}
}
输出:
0xc0000b4008 0
0xc0000b4008 1
0xc0000b4008 2
for range 会自动检测通道是否已关闭。若已关闭,则自动break。