在Go语言中,defer语句会在该函数结束的时候被调用,即使后面的语句运行时出现异常了defer语句仍然会被执行。
需要注意的是,如果defer语句中引用了参数,则该参数的值将是程序到defer这一行的时候的值,而与后面的语句没有关系。
以下为简单测试:
package main
import "fmt"
func main() {
func_b_0()
func_b_1()
func_b_2()
}
func func_b_0() {
fmt.Println("func_b_0...top")
a := 5
defer fmt.Println("a=", a)
a++
}
func func_b_1() {
fmt.Println("func_b_1...top")
a := 5
defer func() {
fmt.Println("a=", a)
}()
a++
}
func func_b_2() {
fmt.Println("func_b_2...top")
a := 5
defer func(a int) {
fmt.Println("a=", a)
}(a)
a++
}
输出:
func_b_0...top
a= 5
func_b_1...top
a= 6
func_b_2...top
a= 5