defer
Go函数里提供了defer关键字,可以注册多个延迟调用,这些调用以先进后出(FILO)的顺序在函数返回前被执行。
func main() {
defer func() {
fmt.Println("firstDefer")
}()
fmt.Println("firstMain")
}
/*
输出
firstMain
firstDefer
*/
defer函数的实参在注册时通过值拷贝传递进去。
func tmpFunc() {
a := 1
defer func(i int) {
fmt.Println("defer i=", i)
}(a)
a++
fmt.Println("tmpFunc a=", a)
}
func main() {
tmpFunc()
fmt.Println("firstMain")
}
/*输出
tmpFunc a= 2
defer i= 1
firstMain
*/
如果defer位于return之后,则不会执行
func tmpFunc() {
a := 1
a++
fmt.Println("tmpFunc a=", a)
return
defer func(i int) {
fmt.Println("defer i=", i)
}(a)
}
func main() {
tmpFunc()
fmt.Println("firstMain")
}
/*
输出
tmpFunc a= 2
firstMain
*/