1,for 循环变量,整个for循环中变量i始终使用一个变量,i地址不变,存放的内容在变
func main() {for i := 0; i < 10; i++ {fmt.Printf("值:%v 地址:%v \n", i, &i)}
}
打印:
值:0 地址:0xc00001e068
值:1 地址:0xc00001e068
值:2 地址:0xc00001e068
值:3 地址:0xc00001e068
值:4 地址:0xc00001e068
值:5 地址:0xc00001e068
值:6 地址:0xc00001e068
值:7 地址:0xc00001e068
值:8 地址:0xc00001e068
值:9 地址:0xc00001e068
若是使用变量地址,注意变量的内容一直在变化。如下例子,&i最后指向内容3
var test_i [](*int)for i := 0; i < 3; i++ {test_i = append(test_i, &i)}for i := 0; i < 3; i++ {fmt.Println(*test_i[i])}
打印
3
3
3
2,for 循环加goroutine的使用,注意goroutine中使用循环变量,会随着for 循环的循环次数变化而变化。
var wg sync.WaitGroupfor i := 0; i < 3; i++ {wg.Add(1)go func() {defer wg.Done()fmt.Println("goroutine 中使用循环变量:", i) // 打印的是循环结束后的 i 值}()}wg.Wait()
相当于for循环结束才真正运行goroutine。此时i最后的值是3.
gorountine 中使用循环变量: 3
gorountine 中使用循环变量: 3
gorountine 中使用循环变量: 3
想要得到不同变量的使用,可以让循环变量作为参数传递进去
var wg sync.WaitGroupfor i := 0; i < 3; i++ {wg.Add(1)go func(t int) {defer wg.Done()fmt.Println("gorountine 中使用循环变量:", t) // 打印的是循环结束后的 i 值}(i)}wg.Wait()
gorountine 中使用循环变量: 0
gorountine 中使用循环变量: 2
gorountine 中使用循环变量: 1