package main
import (
"fmt"
)
//outerFunc是外围函数
//defer执行顺序是,先进后出,延迟调用指定的函数
//当外围函数中语句执行完毕时,只有延迟函数都执行完毕,外围函数才真的结束
//当执行外媒函数中的return时,只有延迟函数都执行完毕,外围函数才返回
//当外围函数中的代码引发运行错误时,只有延迟函数执行完毕,运行时的错误才会被扩散至调用函数。
//因此defer常用在执行释放资源或异常处理等收尾任务
//defer语句在外围函数体中位置不限,数量不限
func printNumbers() {
for i := 0; i < 5; i++ {
//defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
defer func() {
fmt.Printf("%d", i)
}()
}
}
func printNumbers1() {
for i := 0; i < 5; i++ {
//defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
defer func(n int) {
fmt.Printf("%d", n)
}(i)
}
}
func printNumbers2() {
for i := 0; i < 5; i++ {
//defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
defer func(n int) {
fmt.Printf("%d", n)
}(i * 2)
}
}
func main() {
printNumbers()
fmt.Println()
printNumbers1()
fmt.Println()
printNumbers2()
}