defer关键字可以延迟一个函数的执行,直到这个函数返回,无论是正常的return返回,还是由于意外情况。

延迟到函数返回后

被defer延迟执行的函数,其调用会发生在函数返回之后:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func main() {
	ret := returnVal(5)
	fmt.Printf("ret %d", ret)
}

func returnVal(val int) int {
	defer func() {
		val++
		fmt.Println(val)
	}()
	return val
}

//-----console-----
//6
//ret 5

可以看到匿名函数被延迟执行到函数返回之后,因为这里修改了变量val但是函数返回值没有变。

FILO

先通过defer延迟的函数后执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func main() {
	defer func() {
		fmt.Println("defer1")
	}()
	defer func() {
		fmt.Println("defer2")
	}()
}

//-----console-----
//defer2
//defer1

BGM