构造函数:初始化程序,赋予初始值等工作

析构函数:函数结束前的清理工作

defer 类似于其它语言的析构函数,在程序的最后调用

package main

import "fmt"

func main() {
	defer fmt.Println("bbb")
	fmt.Println("aaa")
}

上面的函数先输出的是aaa

多个 defer 时,先写的后执行

代码有内存泄漏等错误时 defer 也能够调用到

与匿名函数搭配使用:

package main
import "fmt"
func main() {
	a := 10
	b := 20
	defer func() {
		fmt.Printf("a = %d b = %d\n", a, b)
	}()
	a = 111
	b = 222
	fmt.Printf("a = %d, b = %d\n", a, b)
	// 输出结果如下
	// a = 111, b = 222
	// a = 111 b = 222
}

与上面的区别是此时的匿名函数被赋值:

package main
import "fmt"
func main() {
	a := 10
	b := 20
	defer func(a, b int) {
		fmt.Printf("a = %d b = %d\n", a, b)
	}(a, b) // 在执行前参数已近被传入函数,这个时候的a和b的值还未被修改

	a = 111
	b = 222
	fmt.Printf("a = %d, b = %d\n", a, b)
	// 输出结果如下
	// a = 111, b = 222
	// a = 10 b = 20
}