延迟不仅用于清理-好的还是不好的做法?

wst*_*wst -1 conventions go

推迟执行代码通常用于Go清理资源。这种情况并不常见,但发生时defer也用于执行常规业务逻辑。就像执行的最后一步一样,无论函数在何处命中return关键字。

Go Blog页面上,我们可以发现“ defer语句将函数调用推送到列表上。保存的调用列表在周围的函数返回之后执行。Defer通常用于简化执行各种清理操作的函数。

他们确实提到清理,但没有提及常规代码执行。显然,它可以执行任意代码,而不必清理。这是最佳做法吗?社区在这方面是否就公约或最佳实践达成任何协议?

icz*_*cza 7

Go编译器不知道什么代码是清除代码。因此,如果可以推迟清除代码,那么显然也可以推迟任何未清除的代码。

延迟函数有一些开销,显然必须管理调用堆栈,但是如果它使您的代码更安全和/或更易于阅读,请继续使用它。最好使用它在返回之前执行任何操作,甚至修改返回的值,甚至在出现紧急情况的情况下。请参阅如何在出现恐慌的Go函数中返回值?

您应该牢记的一件事是:即使代码出现了紧急情况(对于清理代码而言也是如此),延迟函数仍会运行,否则,这将不是正常的执行流程。因此,与不使用延迟相比,使用延迟时会有所不同。请参阅相关内容:循环中的`defer`-会有什么更好的选择?