看看这两段代码:
// return 0
func f() int {
res := 0
defer func(){
res++
}()
return res
}
我知道defer表达式是在return表达式之后执行的。
但是当有一个命名的返回值时,为什么会有所不同呢?
为什么以下函数不返回 0
?
// return 1
func f() (res int) {
res = 0
defer func(){
res++
}()
return res
}
最佳答案
执行顺序为:
- return 语句设置结果参数。
- 延迟调用执行。
- 函数返回结果参数。
延迟函数可以在函数返回之前修改命名结果参数。
第一个示例中的延迟函数修改局部变量 res
,而不是未命名的结果参数。函数 f
返回 0,因为 return
将结果参数设置为 0,并且延迟函数不会更改结果参数。
第二个函数返回 1,因为延迟函数修改了结果参数 res
。
关于go - defer和命名返回值的顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69818560/