序
本文次要钻研一下 golang 的 defer
defer
- return 先赋值 (
对于命名返回值
),而后执行 defer,最初函数返回 - defer 函数调用的执行程序与它们别离所属的 defer 语句的执行程序相同
- defer 前面的表达式能够是 func 或者是 method 的调用,如果 defer 的函数为 nil,则会 panic
实例
实例 1
// f returns 42
func f() (result int) {defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return 6
}
这里 return 先给 result 赋值为 6,之后执行 defer,result 变为 42,最初返回 42
实例 2
func f() int {
result := 6
defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return result
}
这里 return 确定返回值 6,之后 defer 批改 result,最初函数返回 return 确定的返回值
实例 3
func multiDefer() {
for i := 3; i > 0; i-- {defer func(n int) {fmt.Print(n, " ")
}(i)
}
for i := 3; i > 0; i-- {defer fmt.Print(i, " ")
}
}
多个 defer 函数,按程序逆序执行,这里输入 1 2 3
实例 4
var fc func() string
func main() {fmt.Println("hello")
defer fc()}
因为 defer 指定的 func 为 nil,这里 panic
实例 5
func main() {
for i := 3; i > 0; i-- {defer func() {fmt.Print(i, " ")
}()}
}
因为 defer 这里调用的 func 没有参数,等执行的时候,i 曾经为 0,因此这里输入 3 个 0
小结
defer 能够拆解为 return 赋值,defer 执行,最初代码返回三步;defer 的程序按逆序执行。
doc
- Defer_statements
- Golang 之 Defer
- golang 中 defer 执行机会与常见问题