命名返回值和正常返回值之间有什么不同?

Blu*_*Joy 6 go

我关于不同的命名返回值与正常返回值的问题

我的代码

package main

import "fmt"

func main() {
    f := fmt.Println
    f(a())
    f(b())
}

func a() int {
    i := 0
    defer func() {
        i += 1
        fmt.Println("a defer : ", i)
    }()

    return i
}

func b() (i int) {
    i = 0

    defer func() {
        i += 1
        fmt.Println("b defer : ", i)
    }()
    return i
}
Run Code Online (Sandbox Code Playgroud)

结果:

a函数返回0

b功能reutrn 1

为什么?

Kev*_*sse 5

命名返回值还为函数范围分配变量.

func a() int:虽然您已经返回了值i = 0,但由于未定义任何命名值,因此返回了静态值.因此,即使您i在延迟函数中增加它也不会影响返回值.

func b() (i int):变量i已分配(并已初始化为0).即使延迟函数在i = 0返回后运行,范围仍然可访问,因此仍然可以更改.


另一种观点:您仍然可以在延迟函数中更改命名返回值,但不能更改常规返回值.

在以下示例中尤其如此:

func c() (i int) {
    defer func() {
        i = 1
        fmt.Println("c defer : ", i)
    }()
    return 0
}
Run Code Online (Sandbox Code Playgroud)