Golang Go语言中这结果为啥会是 6 呢?
Golang Go语言中这结果为啥会是 6 呢?
在 Q 群里看到这个问题,小白没想明白
play: https://play.golang.com/p/GB1rSAsoTsz
代码如下:
package main
import (
“fmt”
)
func f2() (x int) {
defer func() {
x++
}()
return 5
}
func main() {
x := f2()
fmt.Println("x: ",x)
}
运行返回: x: 6
更多关于Golang Go语言中这结果为啥会是 6 呢?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
return 先执行,5 赋值给 x 了,然后又 x++,最终返回的就是 6,好像是这样?
因为先执行 return,再执行 defer
return 5 在这可以理解分为两步,1 先赋值 x=5,2 再 return 跳转返回 ,而 defer 在 return 之前,也就是 1 和 2 之间,
平时尽量不要给返回值命名,直接返回 int 就行了
https://play.golang.com/p/2Q1TTx7WNkn
defer 部分对 x 有了改动
—
我平常挺习惯给返回值命名的
这个变量命名让人迷惑
因为 return 5 包括三步:
1.给栈里的返回值赋值,即 x = 5 ;
2.执行 defer 注册的 func,x++;
3.return
如果是匿名返回值,即没有主动声明变量来指代栈中的返回值,那自然是没办法直接修改的。
因为要使用 defer 修改返回值,所以要使用命名返回值。
golang 为什么那么喜欢写的那么套娃.
这要从 go 的函数调用说起了
C/C++ 等都是用寄存器实现函数返回值的,go 因为支持多返回值, 所以 go 使用调用者的栈空间作为函数的返回值
也就是说
f2 中的 x 实际上是 main 函数中的地址, return5 时,相当于给 x 赋值 5, 在 defer 中 又 x++ 所以 x 就是 6
厚颜无耻的贴一下之前写了一半的分析。能理解楼上各位大佬说的 golang 传值和返回值方式,这个问题就很好理解了 https://timelife.me/index.php/archives/163/
好像某些面试官喜欢问这种问题。。
在Go语言中,如果你遇到了一个表达式的结果为6,而你又感到困惑,这通常可能是因为涉及到了某些基本的算术运算、变量赋值或者是函数调用的结果。不过,没有具体的代码示例,我只能提供一些常见的情况来解释这个结果。
-
算术运算:最直接的解释可能是简单的算术表达式。例如,
2 + 4
或者3 * 2
的结果都是6。 -
变量赋值与运算:如果你有几个变量参与了运算,并且最终的结果被输出为6,那么可能是这些变量的值以及它们之间的运算导致了这个结果。例如:
a := 3 b := 2 + a // b 现在是 5 c := b + 1 // c 现在是 6 fmt.Println(c) // 输出 6
-
函数返回值:如果你调用了一个函数,并且该函数返回了6,那么这也是一个可能的解释。例如:
func calculate() int { return 6 } result := calculate() fmt.Println(result) // 输出 6
-
数组或切片长度:在某些情况下,如果你在处理数组或切片,并且最终得到了一个长度为6的数组或切片,虽然这不会直接“输出”6,但在某些上下文中可能会被视为结果。
为了更准确地解释为什么你的代码结果是6,我需要看到具体的代码片段。希望这些常见的解释能给你一些启发。