【go】for range

212 阅读2分钟

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。