久恋殇 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 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,