Go 基础面试题, Go 语言中 defer 的变量快照在什么情况下会失效?
Go 基础面试题, Go 语言中 defer 的变量快照在什么情况下会失效?
QA
Step 1
Q:: Go 语言中 defer 的变量快照在什么情况下会失效?
A:: 在 Go 语言中,defer 语句会在函数返回之前执行,而 defer 捕获的变量值是基于 defer 语句执行时的快照。变量的快照在以下情况下可能会“失效”:当 defer 中引用的变量是一个指针或引用类型(如 slice、map、指针等)时,尽管 defer 捕获的是快照,但如果在 defer 执行前这些引用类型的数据发生了改变,defer 捕获的值也会相应改变。例如,如果 defer 捕获了一个指针变量的快照,而在 defer 语句之后对这个指针的指向数据进行了修改,那么在 defer 执行时,指针所指向的数据将是修改后的值。
Step 2
Q:: Go 语言中 defer 的执行顺序是怎样的?
A:: 在 Go 语言中,defer 语句的执行顺序是后进先出(LIFO)的顺序。也就是说,最先声明的 defer 语句会最后执行,而最后声明的 defer 语句会最先执行。
Step 3
Q:: 如何在 Go 中使用 defer 确保资源释放?
A:: 在 Go 语言中,defer 常用于确保资源的释放,例如文件句柄的关闭、数据库连接的释放、锁的解锁等。典型的用法是在打开资源后立即使用 defer 调用关闭操作,从而保证即使函数中途返回或发生 panic,资源也能被正确释放。例如,file, err := os.Open('file.txt'); defer file.Close()
确保文件在函数返回前总是能被关闭。
Step 4
Q:: Go 中的 defer 是否会延迟函数的返回时间?
A:: 是的,defer 语句会延迟函数的返回时间,因为所有的 defer 语句会在函数返回前执行。因此,若有多个 defer 语句,这些语句的执行会影响函数的最终返回时间。不过,通常这种延迟是微不足道的,但在一些需要高性能的场景下可能需要注意。