1. defer的用途及执行
- defer语句中的函数会在return语句更新返回值变量后再执行
- 又因为在函数中定义的匿名函数可以访问该函数包括返回值变量在内的所有变量,所以,对匿名函数采用defer机制,可以使其观察函数的返回值。
2. 两个简单实例
2.1 示例1
package main
import (
"fmt"
)
func main() {
fmt.Println("in main func:", foo())
}
func foo() int {
i := 0
defer fmt.Println("in defer :", i)
i = 1000
fmt.Println("in foo:", i)
return i+24
}
这段代码运行后会打印出
- 这个地方defer中输出的是0而不是1000,可能很多同学有困惑。
- 大概原因是:defer语句中的函数是延迟到return 语句返回后再执行,并不等同于搬移到return语句后再执行。延迟到return语句再执行,在顺序执行到该行时,由于i的值为0,因此此时的变量i的值也为0.
- 如果还有疑问,可以继续往后边看,后边有更加详细的讲解;
in foo: 1000
in defer : 0
in main func: 1024
2.2 示例2
package main
import (
"fmt"
)
func main() {
fmt.Println("in main func:", foo())
}
func foo() int {
i := 0
defer func() {
fmt.Println("in defer :", i)
}()
i = 1000
fmt.Println("in foo:", i)
return i + 24
}
这段代码运行后会打印出
in foo: 1000
in defer : 1000
in main func: 1024
- 原因分析
- 这是因为示例2使用了匿名函数,匿名函数可以访问该函数(包含匿名函数的函数,即示例中的foo)包括返