defer 是否在函数 returns 之后运行?
Does defer runs after function returns?
我一直盯着这段代码,但无法弄清楚它的行为原因。
package main
import (
"fmt"
)
var i int
func example() int {
defer func() {
fmt.Println("defer")
i = 1
}()
fmt.Println("first")
return i
}
func main() {
fmt.Println(example())
fmt.Println(i)
}
起初,我的预期输出是:
first
defer
1
1
但是,如您所见in the playground实际输出是:
first
defer
0
1
是延迟匿名函数行为吗? Nope
那么,为什么要打印 0
?
Does defer runs after function returns?
So, why is it printing 0?
因为你returning 0.
example()
return 一个 int
按值。当计算 return i
时,i
的当前值是 returned。在评估 return 之后,执行 defer
函数,将存储在 i
的值更改为 1
。但是 0
值已经是 return 值。
Go 可以修改函数的 return 值,但前提是 return 值有一个名称。
func example() (j int) {
defer func() { j = 1 }()
return 0
}
但在你的情况下,你没有命名你的 return 变量,所以你不能在延迟中修改它。
我一直盯着这段代码,但无法弄清楚它的行为原因。
package main
import (
"fmt"
)
var i int
func example() int {
defer func() {
fmt.Println("defer")
i = 1
}()
fmt.Println("first")
return i
}
func main() {
fmt.Println(example())
fmt.Println(i)
}
起初,我的预期输出是:
first
defer
1
1
但是,如您所见in the playground实际输出是:
first
defer
0
1
是延迟匿名函数行为吗? Nope
那么,为什么要打印 0
?
Does defer runs after function returns?
So, why is it printing 0?
因为你returning 0.
example()
return 一个 int
按值。当计算 return i
时,i
的当前值是 returned。在评估 return 之后,执行 defer
函数,将存储在 i
的值更改为 1
。但是 0
值已经是 return 值。
Go 可以修改函数的 return 值,但前提是 return 值有一个名称。
func example() (j int) {
defer func() { j = 1 }()
return 0
}
但在你的情况下,你没有命名你的 return 变量,所以你不能在延迟中修改它。