defer func for循环,为啥结果不是012,而是3 3 3呢,麻烦大佬解答下,百度无果,小白问题,打扰大家了。

lishuailw · · 1118 次点击
更多评论
``` func main() { for i := 0; i < 3; i++ { defer func(i int){ fmt.Println(i) }(i) } }``` 你对照这个试试就能知道为啥了
#1
这是一个闭包,闭包保存或记录了它产生时的外部函数的所有环境。当defer延迟开始执行时,才是真正执行了闭包,此时闭包内部的变量才会进行赋值的操作。 也就是说,i 这个变量在闭包内的生命周期得到了保证。因此在执行这个闭包的时候,会去外部环境寻找最新的数值! 此时,变量i的最新值是for循环退出时i的值,为3
#2