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
slclub
坚持就是胜利
无defer 是 0, 1 ,2 有defer defer 定义的所有函数是在 return 之前运行 ,所有函数体内代码之后 有defer 你的函数运行逻辑可以改写成非defer 的代码 ```go func main() { K:=0 for i := 0; i < 3; i++ { k = i } for i:=0; i< 3; i++ { func() { fmt.Println(k) }() } } ```
#3