defer

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.