面试题答案
一键面试在Go语言中,defer语句会在函数返回前执行,多个defer语句按照后进先出(LIFO)的顺序执行。对于错误返回,无论是普通返回还是带错误值的返回,defer语句都会在返回前执行,这有助于确保资源的正确清理。
以下是具体的代码示例:
package main
import (
"fmt"
)
func readFile() error {
// 模拟打开文件操作
fmt.Println("打开文件")
// 定义defer语句来关闭文件,模拟资源清理
defer func() {
fmt.Println("关闭文件")
}()
// 模拟读取文件时发生错误
hasError := true
if hasError {
fmt.Println("读取文件出错")
return fmt.Errorf("文件读取错误")
}
fmt.Println("文件读取成功")
return nil
}
在上述代码中:
defer
语句定义了文件关闭操作,无论函数如何返回,该defer
语句都会在函数返回前执行,确保文件资源被正确清理。- 当
hasError
为true
时,函数返回一个错误,在返回前,defer
语句会先执行,打印“关闭文件”。 - 当
hasError
为false
时,函数正常返回,同样在返回前,defer
语句会执行,打印“关闭文件”。
执行示例代码如下:
func main() {
err := readFile()
if err != nil {
fmt.Printf("错误: %v\n", err)
}
}
总结:
- 执行顺序:defer语句在函数返回前执行,多个defer按LIFO顺序执行。
- 资源清理:通过在函数中使用defer语句,可以确保在函数返回时,无论是正常返回还是错误返回,相关资源(如文件、数据库连接等)都能被正确清理。
- 错误处理:在defer语句执行完毕后,函数才会真正返回错误值,调用者可以根据返回的错误值进行相应的处理。