我认为,一旦您查看以下设置,问题就很清楚了?
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
我是否必须在
panic(err)
的错误情况下调用延迟函数,因为那是在一个新块中,因此在不同的范围内?
我是否必须在
的错误情况下调用延迟函数,因为那是在一个新块中,因此在不同的范围内?panic(err)
不,有两个原因:(1)
defer
在函数的级别运行,而不是块的级别(因此在这方面它与局部变量的范围不同); (2) 每当周围的函数返回时,调用就会发生,即使它“返回”只是因为它调用了某个最终出现恐慌的函数。
正如规范所说:
“defer”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,要么是因为周围函数执行了 return 语句,到达了其函数体的末尾,要么是因为相应的 goroutine 正在恐慌。
(特别要注意的是,恐慌与 goroutine 恐慌有关,而不是担心到底是哪个函数触发了恐慌。)
我建议您将规范加入书签,并在遇到此类问题时查阅;尽管其中部分内容是技术性的,但大部分内容都非常容易理解。