defer 执行顺序和调用顺序相反,类似于栈后进先出。
defer在 return 之后执行,但在函数推出之前,defer可以修改返回值。
func test() int {
i := 0
defer func() {
fmt.Println("defer1")
}()
defer func() {
i += 1
fmt.Println("defer2")
}()
return i
}
func main() {
fmt.Println("return", test())
}
// defer2
// defer1
// return 0
上面的例子中,test返回值并没有修改,这是由于Go的返回机制决定的,执行Return语句后,Go会创建一个临时变量保存返回值。如果是有名返回(也就是指明返回值 func test() (i int) {...})
func test() (i int) {
i = 0
defer func() {
i += 1
fmt.Println("defer2")
}()
return i
}
func main() {
fmt.Println("return", test())
}
// defer2
// return 1
这个例子中,返回值被修改了。对于有名返回值的函数,执行return语句时,并不会再创建临时变量保存,因此defer语句修改了 i,即对返回值产生了影响
文章探讨了Go语言中defer语句的执行顺序,它遵循后进先出的原则,并且在函数返回前执行。在无名返回值的函数中,defer无法修改返回值,因为返回值会被临时变量保存。然而,对于有名返回值的函数,defer可以在return之后修改返回值,因为它直接作用于返回变量。
1849

被折叠的 条评论
为什么被折叠?



