defer延迟执行
代码
//example.go
package test
import "fmt"
//该函数为闭包函数
func deferUtil() func(int) int {
i := 0
return func(n int) int {
fmt.Printf("本次调用接收到n=%v\n", n)
i++
fmt.Printf("匿名工具函数被第%v次调用\n", i)
return i
}
}
/*
本次调用接收到n=2
匿名工具函数被第1次调用
本次调用接收到n=1
匿名工具函数被第2次调用
*/
func Defer1() int {
f := deferUtil()
defer f(1)
return f(2)
} //当Defer1函数返回之后,被延迟执行的函数就会按照先进后出的顺序进行调用
/*
本次调用接收到n=3
匿名工具函数被第1次调用
本次调用接收到n=2
匿名工具函数被第2次调用
本次调用接收到n=1
匿名工具函数被第3次调用
*/
func Defer2() int {
f := deferUtil()
defer f(f(3)) //参数会被立即求值
return f(2)
}
/*
本次调用接收到n=1
匿名工具函数被第1次调用
本次调用接收到n=2
匿名工具函数被第2次调用
*/
func Defer() int {
f := deferUtil()
f(1)
return f(2)
}
/*
关于defer:
1. 被延迟执行的函数会压入到栈中,当return之后,被延迟执行的函数会按照先进后出的顺序调用
2. 延迟执行的函数,其参数会被立即求值
*/
//defer...recover的使用
func DeferRecover() {
//recover会捕获异常,将捕获后的异常信息放到err中
//如果没有异常信息,那么为nil
//匿名函数
defer func() {
err := recover()
if err != nil {
//输出异常信息
fmt.Println(err)
}
}()
n := 0
fmt.Println(3 / n)
}
//main.go
package main
import (
"GoExample/test"
"fmt"
)
/*
runtime error: integer divide by zero
test.DeferRecover()之后还在运行....
*/
func main() {
test.DeferRecover()
fmt.Println("test.DeferRecover()之后还在运行....")
}
本博客参考自:
https://www.bilibili.com/video/BV1s341147US/?spm_id_from=333.337.search-card.all.click&vd_source=a642bb3ddc5b706845426dc41d73fbda