在错误恐慌块中再次调用延迟函数

问题描述 投票:0回答:1

我认为,一旦您查看以下设置,问题就很清楚了?

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)
的错误情况下调用延迟函数,因为那是在一个新块中,因此在不同的范围内?

go asynchronous
1个回答
0
投票

我是否必须在

panic(err)
的错误情况下调用延迟函数,因为那是在一个新块中,因此在不同的范围内?

不,有两个原因:(1)

defer
函数的级别运行,而不是的级别(因此在这方面它与局部变量的范围不同); (2) 每当周围的函数返回时,调用就会发生,即使它“返回”只是因为它调用了某个最终出现恐慌的函数。

正如规范所说:

“defer”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,要么是因为周围函数执行了 return 语句,到达了其函数体的末尾,要么是因为相应的 goroutine 正在恐慌。

(特别要注意的是,恐慌与 goroutine 恐慌有关,而不是担心到底是哪个函数触发了恐慌。)

我建议您将规范加入书签,并在遇到此类问题时查阅;尽管其中部分内容是技术性的,但大部分内容都非常容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.