当此延迟语句(没有 return)运行时,为什么 return 值 return 没有被编辑?

Why isn't the return value returned when this deferred statement (without a return) runs?

我正在通读 go specification 并且不完全理解 defer 示例的行为。

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

该函数有一个名为 return 的匿名延迟函数递增。函数以 "return 0" 结束。此值不是 returned,而是递增的变量。

为了理解这种行为,我 运行 提出了更多问题。如果我为 return 变量赋值,那似乎对 return 值没有影响。

//b returns 1
func b() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return 0
}

但是,如果最后一行改为:

return result

一切如我所料。

https://play.golang.org/p/732GZ-cHPqU

谁能帮助我更好地理解为什么这些值得到 returned 以及这些函数的范围。

specification says this about deferred functions:

if the deferred function is a function literal and the surrounding function has named result parameters that are in scope within the literal, the deferred function may access and modify the result parameters before they are returned.

and this about return statements:

A "return" statement that specifies results sets the result parameters before any deferred functions are executed.

示例 1:

func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

result变量初始化为零; return 语句将 result 设置为零;延迟函数将 result 递增到 1;函数 returns 1.

示例 2:

func b() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return 0
}

result变量在函数的第一条语句中设置为10; return 语句将 result 设置为零;延迟函数将 result 递增到 1;函数 returns 1.

示例 3:

func c() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return result
}

result变量在函数的第一条语句中设置为10; return 语句将 result 设置为 10;延迟函数递增 result 到 11,函数 returns 11.