```go
func main() {
for i := 0; i < 3; i++ {
defer func(){
fmt.Println(i)
}()
}
}
```
输出结果:
<br/>3
<br/>3
<br/>3
我理解的输出结果:
<br/>2
<br/>1
<br/>0
***
<br/>请问为什么是输出 3 3 3呢?defer 不是后进先出吗?但怎么出来个3呢???疯了啊
更多评论
```
func main() {
for i := 0; i < 3; i++ {
defer func(i int){
fmt.Println(i)
}(i)
}
}```
你对照这个试试就能知道为啥了
#1
这是一个闭包,闭包保存或记录了它产生时的外部函数的所有环境。当defer延迟开始执行时,才是真正执行了闭包,此时闭包内部的变量才会进行赋值的操作。
也就是说,i 这个变量在闭包内的生命周期得到了保证。因此在执行这个闭包的时候,会去外部环境寻找最新的数值!
此时,变量i的最新值是for循环退出时i的值,为3
#2