gpt4 book ai didi

go - 命名返回值和普通返回值有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 01:18:52 28 4
gpt4 key购买 nike

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

我的代码

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
}

结果:

函数返回0

b函数reutrn 1

为什么?

最佳答案

命名的返回值还为您的函数范围分配了一个变量。

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
}

关于go - 命名返回值和普通返回值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48680222/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com