Defer 作用:defer 延迟函数,释放资源,收尾工作;如释放锁,关闭文件,关闭链接,捕获 panic
避坑指南:defer 函数紧跟在资源打开后面,否则 defer 可能得不到执行,导致内存泄露。
一、多个defer的执行顺序
多个 defer 调用顺序是 LIFO(后入先出),defer后的操作可以理解为压入栈中。
defer,return,return value(函数返回值) 执行顺序:首先return,其次return value,最后defer。
二、defer可以修改函数最终返回值,修改时机
有名返回值或者函数返回指针。
1、有名返回值
func b() (i int) {
defer func() {
i++
fmt.Println("defer2:", i)
}()
defer func() {
i++
fmt.Println("defer1:", i)
}()
return i //或者直接写成return
}
func main() {
fmt.Println("return:", b())
}
// 输出:
// defer1: 1
// defer2: 2
// return: 2
2、函数返回指针
func c() *int {
var i int
defer func() {
i++
fmt.Println("defer2:", i)
}()
defer func() {
i++
fmt.Println("defer1:", i)
}()
return &i
}
func main() {
fmt.Println("return:", *(c()))
}
// 输出:
// defer1: 1
// defer2: 2
// return: 2