go语言—defer语句

文章详细阐述了Go语言中的defer语句的工作原理,它用于延迟函数的执行,通常用于资源清理如关闭文件或释放连接。defer语句按照后进先出的顺序执行,且在return之后执行,可以影响有命名返回值的函数的结果。但在匿名返回值的函数中,defer无法修改返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • defer语句会将其后面跟随的语句进行延迟处理
  • 先被defer的语句最后执行,最后被defer的语句最先被执行
fmt.Println("start")
defer fmt.Println(1) // 将defer放入延迟调用栈,先放的位于栈底被最后执行
defer fmt.Println(2)
defer fmt.Println(3) // 最后放的位于栈顶,最先调用
fmt.Println("end")

defer begin
defer end
3
2
1

defer用途

  • 关闭文件句柄
  • 资源释放
  • 数据库连接释放

defer存在时return的执行逻辑
defer、return、返回值三者的执行逻辑是:

  • return最先执行,return将值写入返回值中
  • 然后defer开始执行延迟函数
  • 最后函数携带当前返回值退出

当defer放在return后面时就不会被执行

   func deferFuncReturn() (result int) {   
   	i := 1
       defer func() {
          result++
       }()    
       return i
   }
 
 执行顺序:
 result = i //先将i值写入返回值中
 result ++ //再执行defer
 return //函数结束

主函数返回值有命名时,defer可能会影响返回值

func TestFunc() (result int) {
    defer func() {
        result = 1024
    }()

    return 2048

}

func main() {
    fmt.Println(TestFunc())
}

执行顺序;
result = 2048 //先将return 2048写入到返回值中
result = 1024 //再执行defer函数,result=1024
return //函数结束,结果是1024

主函数拥有的是匿名返回值时,defer无法操作返回值

func TestFunc() int {
    result := 1024

    defer func() {
        result = 2048
    }()

    return result
}

func main() {
    fmt.Println(TestFunc())
}

执行结果:1024
1defer func虽然更新了result的值,并没有对函数返回值造成影响。原因是该函数的int类型返回值未命名(即匿名返回值),所以 defer func无法修改该返回值,只是修改了result变量值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值