Go语言学习之旅15——延迟调用defer

defer关键字修饰的语句将获得延时执行的特性,将会在该方法结束前调用

注意:defer语句只能出现在方法内部

defer的使用

1
2
3
4
5
6
7
func main() {
defer fmt.Println("print defer")
fmt.Println("print 1")
}

// print 1
// print defer

多个defer的调用顺序

defer是延时加载的,当普通语句执行完毕后,defer的语句遵循逆序执行:最先写的defer语句最后执行

1
2
3
4
5
6
7
8
9
10
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
}
/*
* 3
* 2
* 1
*/

注意:不管程序是否报错中断,defer语句总会执行,可以理解为Java的finally

defer和匿名函数的结合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
a := 10
b := 20

defer func(int, int) {
fmt.Printf("内部:a的函数内值:%d,b的函数内值%d\n", a, b)
}(a, b)

a = 888
b = 999
fmt.Printf("外部:a的函数内值:%d,b的函数内值%d\n", a, b)

}

以上程序的执行结果为:

1
2
外部:a的函数内值:888,b的函数内值999
内部:a的函数内值:888,b的函数内值999

我们可以看到,a和b的函数内打印的值是在+=执行后的