defer的作用是延迟函数的调用(defer后面必须是函数和方法),常用于保证一些资源最终一定能够得到回收和释放。
1、这些调用以先进后出的顺序在函数返回前执行
package mainimport "fmt"func main(){
defer func(){
fmt.Println("first")}()defer func(){
fmt.Println("second")}()fmt.Println("star")
}
执行结果:
2、defer后面的函数实参是在注册时通过值拷贝传递的
package mainimport "fmt"func main(){
a:=0defer func(a int){
fmt.Println("defer",a)}(a)a++fmt.Println("main",a)
}
执行结果:
3、
1)defer必须先注册才能执行,如果放在return之后,则因为defer没有被注册不会被执行
package mainimport "fmt"func main(){
fmt.Println("star")returndefer func(){
fmt.Println("defer")}()
}
2)调用os.Exit(int)主动退出进程,defer也不会执行
package mainimport ("fmt""os"
)func main(){
defer func(){
fmt.Println("defer")}()fmt.Println("star")os.Exit(1)return}
1)和2)的执行结果;