go for 循环变量的使用及易错点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值