defer可以类比于Java的try-with-resources,都是先注册的后调用。
- defer用于注册一个延迟调用(在函数返回之前调用)。
- defer典型的应用场景是释放资源,比如关闭文件句柄,释放数据库连接等。
- 如果同一个函数里有多个defer,则后注册的先执行。
- defer后可以跟一个func,func内部如果发生panic,会把panic暂时搁置,当把其他defer执行完之后再来执行这个。
- defer后不是跟func,而直接跟一条执行语句,则相关变量在注册defer时被拷贝或计算。
func basic() {
fmt.Println("A")
defer fmt.Println(1) fmt.Println("B")
//如果同一个函数里有多个defer,则后注册的先执行
defer fmt.Println(2)
fmt.Println("C")
}
打印顺序
A
B
C
2 #如果同一个函数里有多个defer,则后注册的先执行。
1
func defer_exe_time() (i int) {
i = 9
defer func() { //defer后可以跟一个func
fmt.Printf("first i=%d\n", i) //打印5,而非9。充分理解“defer在函数返回前执行”的含义,不是在“return语句前执行defer”
}()
defer func(i int) {
fmt.Printf("second i=%d\n", i) //打印9
}(i)
defer fmt.Printf("third i=%d\n", i) //defer后不是跟func,而直接跟一条执行语句,则相关变量在注册defer时被拷贝或计算
return 5
}
打印顺序
third i=9
second i=9
first i=5