defer用于延迟调用指定函数,defer只能出现在函数内部,因为defer的延迟特点,可以把defer语句用于回收资源、清理资源等
简单例子
func demo1() {
defer fmt.Printf("defer execute. \n")
fmt.Printf("welcome to golang ! \n")
}
输出
welcome to golang !
defer execute.
例子2
var i = 0
func printI() {
fmt.Printf("i=%d \n",i)
}
func demo2() {
for ;i<10;i++ {
defer printI();
}
}
i=10
i=10
i=10
i=10
i=10
i=10
i=10
i=10
i=10
i=10
因为defer是最后执行的,这个时候i已经是10了
例子3
var j=0
func printJ(j int) {
fmt.Printf("j=%d \n",j)
}
func demo3() {
for ;j<10;j++ {
defer printJ(j);
}
}
j=9
j=8
j=7
j=6
j=5
j=4
j=3
j=2
j=1
j=0
一个函数有多个defer时,最后的语句先执行
例子4
func demo4() {
defer fmt.Printf("defer execute 1. \n")
defer fmt.Printf("defer execute 2. \n")
defer fmt.Printf("defer execute 3. \n")
defer fmt.Printf("defer execute 4. \n")
}
defer execute 4.
defer execute 3.
defer execute 2.
defer execute 1.