You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中panic错误块是否需重复调用延迟函数?

是否需要手动调用已延迟的connection.Destroy()?

先看你给出的代码场景:

config := database.NewConfig()
connection := database.Connect(config)
defer connection.Destroy()

...

err = app.Listen(address)
if err != nil {
    connection.Destroy() // Do i need this?
    panic(err)
}

... // defer connection.Destroy() is called 

结论是:完全不需要手动调用,理由如下:

  • Go语言的defer语句只要在当前函数内注册,不管函数是正常执行完毕返回,还是中途触发panic退出,注册的延迟函数都会被执行——哪怕panic是在代码块里抛出的,只要还没跳出当前函数作用域,defer就会生效。
  • 要是手动调用connection.Destroy()再抛出panic,会导致销毁逻辑被执行两次,很可能引发额外问题(比如重复关闭数据库连接导致的报错)。
  • 正确做法是删掉那行手动调用的代码,只保留defer connection.Destroy(),这样不管服务启动成功后正常退出,还是启动失败触发panic,数据库连接都会被正确销毁。

修正后的代码示例:

config := database.NewConfig()
connection := database.Connect(config)
defer connection.Destroy()

...

err = app.Listen(address)
if err != nil {
    panic(err) // 无需手动调用Destroy,defer会自动处理
}

... // 正常退出时defer执行销毁逻辑

内容的提问来源于stack exchange,提问作者jksevend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:14:57