我关于不同的命名返回值与正常返回值的问题
我的代码
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
为什么?
命名返回值还为函数范围分配变量.
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)
| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |