defer执行时机:
- 包含defer的函数返回时 (延迟是相对一个函数并非代码块)
- 包含defer的函数执行到末尾时
- 所在的goroutine发生panic时(panic之后的defer不执行)
执行顺序( LIFO )
编译时从上到下放入栈中,执行时从栈中弹出。
注意事项:
由于defer的频繁使用经常会导致出现一些错误,所以使用时需要注意:
- 判断没有err之后再释放资源
if err != nil{
Logger.Println(" err:", err)
return
}
defer ...
- 调用os.Exit()时defer 不会执行
- 在匿名返回值和命名返回值函数中表现不同
- defer后必须是函数或方法的调用