下面的程序返回
<nil>
hello
Run Code Online (Sandbox Code Playgroud)
我希望两者都会返回“hello”,但事实并非如此。我发现该行为在语言规范中作为示例给出。
例如,如果延迟函数是函数文字,并且周围函数具有在文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。
我的问题是:为什么 defer 对周围函数中定义的变量的工作方式与对命名结果的工作方式不同?这不就是在周围函数返回之前执行的闭包吗?
package main
import (
"errors"
"fmt"
)
func main() {
fmt.Println(up())
fmt.Println(up2())
}
func up() error {
var err error
defer func() {
err = errors.New("hello")
}()
return err
}
func up2() (err error) {
defer func() {
err = errors.New("hello")
}()
return err
}
func up3() error {
var err error
fn := func() {
err = errors.New("hello")
}
fn()
return err
}
Run Code Online (Sandbox Code Playgroud)