```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
无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