golang defer的工作原理?
在 Go 中,defer
是一个关键字,用于在函数执行结束时延迟执行一段代码块。无论函数是正常返回还是发生了异常,defer
关键字都能够确保所指定的代码块被执行。
当一个函数中包含了一个或多个 defer
语句时,这些语句将会按照逆序的顺序执行。也就是说,最后一个 defer
语句指定的代码块将会最先执行,而第一个 defer
语句指定的代码块将会最后执行。
下面是一个简单的例子,演示了 defer
关键字的使用:
func main() { defer fmt.Println("World") defer fmt.Println("Hello") fmt.Println("Goodbye") }
输出结果为:
Goodbye Hello World
在上面的例子中,我们使用了两个 defer
语句。首先,"Goodbye" 被直接打印出来,因为它位于 defer
语句之前。然后,在 main
函数返回之前,defer
语句按逆序执行。因此,"World" 首先被打印出来,接着是"Hello"。
defer
通常用于在函数返回之前执行一些清理或释放资源的操作。它的使用可以确保在函数退出之前必定会执行这些操作,无论函数是否发生了异常。例如,在打开文件后使用 defer
可以确保在函数返回之前关闭文件。
需要注意的是,defer
语句中的函数参数或变量会在 defer
语句执行时进行求值,并且结果会被保存下来,而不是在 defer
语句声明的时候进行求值。