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