defer语句延迟执行一个函数,该函数被推迟到当包含它的程序返回时(包含它的函数 执行了return语句/运行到函数结尾自动返回/对应的goroutine panic)执行。
每次defer语句执行时,defer修饰的函数的返回值和参数取值会照常进行计算和保存,但是该函数不会执行。等到上一级函数返回前,会按照defer的声明顺序倒序执行全部defer的函数。defer的函数的任何返回值都会被丢弃。
package main
import "fmt"
func test() {
f := func(){ fmt.Println("Test") }
defer fmt.Println("Test2")
defer f()
// f = nil // 这里将函数的“值”设为nil,此时再尝试执行这个函数的时候
defer fmt.Println("Test1")
defer f()
}
func main() {
test()
}
输出
Test
Test1
Test
Test2
可以看出在一个方法中,defer是倒序执行的