Go 延迟的可能用例是什么?

Go 延迟的可能用例是什么?,go,Go,defer关键字的实际用途是什么 例如,不要写这个: func main() { f := createFile("/tmp/defer.txt") defer closeFile(f) writeFile(f) } 我可以这样写: func main() { f := createFile("/tmp/defer.txt") writeFile(f) closeFile(f) } 那么,我为什么要用它来代替通常的函数放置呢?延迟函数总是会被执

defer
关键字的实际用途是什么

例如,不要写这个:

func main() {
    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}
我可以这样写:

func main() {
    f := createFile("/tmp/defer.txt")
    writeFile(f)
    closeFile(f)
}

那么,我为什么要用它来代替通常的函数放置呢?

延迟函数总是会被执行,即使是在一个panic或return语句之后

在现实世界的代码中,很多事情发生在打开/关闭类型的调用对之间,而defer允许您在源代码中将它们保持在一起,并且您不必为每个return语句重复关闭调用


去写一些真正的代码。延迟的用处不久就会显而易见。

在捕获可能引起恐慌的代码时非常有用

通常,在使用
接口{}
(一种“任意”类型)或反射时,您会遇到一些问题,即您试图转换为与数据的实际类型不匹配的类型


延迟
在顶部使用一个函数来处理该错误就是如何节省时间并保持应用程序运行。

在您的简单示例中,没有什么理由(除了良好的实践之外)可能重复。但是,在更复杂/更大的函数中,您可以使用defer()来确保无论函数如何结束,都会执行某些操作——主要是未捕获的错误。例如,当我分配一个数据库句柄时,我总是立即执行一个defer()来关闭句柄。将错误处理添加到该代码中,这应该是显而易见的。这还不够:您需要养成处理所有可能错误的习惯。一旦您真正开始这样做,
defer
就成为了在出现问题时进行清理的一种非常明显的方式。