久恋殇 2022-09-08 20:40 采纳率: 75%
浏览 14
已结题

golang中关于return、defer和匿名函数的执行顺序

问题遇到的现象和发生背景

以下两端代码为什么一个输出5,一个输出6

问题相关代码,请勿粘贴截图
package main
   
import "fmt"
   
func f4() (x int) {
 defer func(x int) {
  x++
 }(x)
 return 5
}
   
func main() {
   fmt.Println(f4())//结果输出5
}


package main

import "fmt"

func f2() (x int) {
 defer func() {
  x++
 }()
 return 5
}

func main() {
 fmt.Println(f2())//结果输出6
}
运行结果及报错内容

debug显示第一份结果为5的代码中return 5 被执行了两次,是为什么啊

  • 写回答

1条回答 默认 最新

  • Junebao 2022-09-09 10:40
    关注

    并不是return 执行了两遍,具名返回值可能会造成一些困扰,上面的程序等价于:

    package main
       
    import "fmt"
       
    func f4() int {
        var x int
    
        defer func(x int) {
            x++
        }(x)
    
        x = 5
        return x
    
    }
       
    func main() {
       fmt.Println(f4())//结果输出5
    }
     
    

    不同之处在于 defer 接受了一个有参函数,因为 Go 是值拷贝,所以 defer 里执行加加的 x 和 返回值 x 不是同一个了,下面返回 6 的同理,defer 中执行加加的是父作用域的 x 也就是返回值 x

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月14日
  • 已采纳回答 10月6日
  • 创建了问题 9月8日

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序