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

15 回复

匿名返回值和命名返回值 defer 处理的不一样
https://my.oschina.net/henrylee2cn/blog/505535

更多关于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 就行了

#5 谢谢提醒

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,而你又感到困惑,这通常可能是因为涉及到了某些基本的算术运算、变量赋值或者是函数调用的结果。不过,没有具体的代码示例,我只能提供一些常见的情况来解释这个结果。

  1. 算术运算:最直接的解释可能是简单的算术表达式。例如,2 + 4 或者 3 * 2 的结果都是6。

  2. 变量赋值与运算:如果你有几个变量参与了运算,并且最终的结果被输出为6,那么可能是这些变量的值以及它们之间的运算导致了这个结果。例如:

    a := 3
    b := 2 + a  // b 现在是 5
    c := b + 1  // c 现在是 6
    fmt.Println(c)  // 输出 6
    
  3. 函数返回值:如果你调用了一个函数,并且该函数返回了6,那么这也是一个可能的解释。例如:

    func calculate() int {
        return 6
    }
    result := calculate()
    fmt.Println(result)  // 输出 6
    
  4. 数组或切片长度:在某些情况下,如果你在处理数组或切片,并且最终得到了一个长度为6的数组或切片,虽然这不会直接“输出”6,但在某些上下文中可能会被视为结果。

为了更准确地解释为什么你的代码结果是6,我需要看到具体的代码片段。希望这些常见的解释能给你一些启发。

回到顶部