golang for 循环创建协程问题

本文介绍了在Golang中使用for循环启动协程时,由于值拷贝和并发访问导致的变量共享问题。博主分析了问题产生的原因,即协程创建的延迟使得多个协程访问相同的变量副本。为解决这个问题,提出了使用闭包函数的方法,通过值传递确保每个协程拥有独立的变量副本,从而避免了竞态条件。文章强调在使用协程时要注意变量的访问方式,提倡使用闭包来保证并发安全性。
摘要由CSDN通过智能技术生成

      golang里,在for循环里面起协程,如下代码。会输出for循环的最后一个数,或者参杂有不确定的其他数字。

 原因如下:golang是值拷贝传递。for循环很快,协程创建需要的时间大于for循环的时间。因为协程创建 需要进行 堆栈分配,上下文准备,以及与内核态的线程进行映射工作等。所以在协程创建好后,大家同时去访问tmp变量,这个时候 tmp 就被多个协程共享了,导致取到的值都一样了。

解决方案:就是使用golang的闭包函数。给匿名函数增加入参,因为是值传递,所以每次for创建一个协程的时候,会拷贝一份tmp传到这个协程里面去,这样就可以实现0-9的数字打印了。修改后的代码和实验结果也在下面。

 所以在使用协程的时候,需要注意,尽量不要用外面的值,而是改为用闭包这种。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值