运行一下代码查看输出情况:
func main() { tests1ice := []int{1, 2, 3, 4, 5} for _, v := range tests1ice { go func() { fmt.Println(v) }() } time.Sleep(time.Millisecond) }
打印结果会是五个相同的值。
如果想逐个取出切片的元素,需要强制使用传值的方法,将代码书写成以下方式:
func main() { tests1ice := []int{1, 2, 3, 4, 5} for _, v := range tests1ice { go func(v int) { fmt.Println(v) }(v) } time.Sleep(time.Millisecond) }
也可以这样处理:
func main() { data := []string{"one", "two", "three"} for _, v := range data { vCopy := v go func() { fmt.Println(vCopy) }() } time.Sleep(3 * time.Second) // 输出 one two three }