10.defer
1.defer
1.1.示例说明
defer1.go
package chapter07
import "fmt"
// main
func Run() {
// defer 相当于 压栈,先进后出 原则
defer fmt.Println("main.end1")
defer fmt.Println("main.end2")
fmt.Println("main::hello go 1")
fmt.Println("main::hello go 2")
}
defer1_test.go
package chapter07
import "testing"
func TestRun(t *testing.T) {
Run()
}
执行结果
=== RUN TestRun
main::hello go 1
main::hello go 2
main.end2
main.end1
--- PASS: TestRun (0.00s)
PASS
ok
2.defer知识点
2.1.defer 的调用顺序
示例代码
defer2.go
/*
知识点一:defer的执行顺序
*/
package chapter07
import "fmt"
func func1() {
fmt.Println("A")
}
func func2() {
fmt.Println("B")
}
func func3() {
fmt.Println("C")
}
// main
func Run2() {
defer func1()
defer func2()
defer func3()
}
defer2_test.go
package chapter07
import "testing"
func TestRun2(t *testing.T) {
Run2()
}
执行结果
=== RUN TestRun2
C
B
A
--- PASS: TestRun2 (0.00s)
PASS
ok
图示说明
defer函数压栈
调用func3()
调用func2()
调用func1()
2.2.知识点二--defer和return谁先谁后
示例代码
defer3.go
/*
知识点二:defer和return谁先谁后
*/
package chapter07
import "fmt"
func deferFunc() int {
fmt.Println("defer func called ...")
return 0
}
func returnFunc() int {
fmt.Println("return func called ...")
return 1
}
// returnAndDefer 函数
func returnAndDefer() int {
defer deferFunc()
return returnFunc()
}
// main
func Run3() {
returnAndDefer()
}
defer3_test.go
package chapter07
import "testing"
func TestRun3(t *testing.T) {
Run3()
}
执行结果
=== RUN TestRun3
return func called ...
defer func called ...
--- PASS: TestRun3 (0.00s)
PASS
ok
说明
return
函数 优先于defer
函数defer
函数是在函数运行结束后,才进行出栈调用