何为闭包
一个函数和与其相关的引用环境组合而成的实体
下面这篇文章写得很详细,将根据这个文章分析
匿名函数中用到的外部变量,会将该变量的地址记录下来,等闭包中真正执行到该变量的时候才取它的值,for循环中,val的地址是固定的,每一个循环都将values里面的下一个元素放进这个地址,go协程完成初始化等工作需要时间,等真正执行里面的逻辑时for循环已经执行完,val里面是values最后一个元素,所以所有的协程获取到的值都是最后一个元素,不符合预期
正确解决办法1,将变量通过匿名函数参数形式传进函数,相当于将外部变量复制一份给匿名函数,对每一个协程的入参val,地址都不同,且跟外部val也不同
解决方法2 ,for循环声明新变量,匿名函数会记录变量的地址,该变量只在此次循环中使用,下一个循环声明的就是另一个变量了,虽然名字一样,但地址改变了
所以总而言之,就是闭包里面会记录外部变量地址,如果地址里面值总是被更新,那么结果可能就会不符合预期