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.WaitGroup
for 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.WaitGroup
for 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