面试题答案
一键面试以下是Go语言中使用defer
语句管理文件资源的示例代码:
package main
import (
"fmt"
"os"
)
func readFileContents(filePath string) ([]byte, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
data, err := os.ReadFile(filePath)
if err != nil {
return nil, err
}
return data, nil
}
解释
-
正常结束:
- 当函数
readFileContents
正常执行到末尾,没有发生错误时,defer
语句会在函数返回之前执行。这里defer file.Close()
会确保在函数返回前关闭打开的文件,即使在os.ReadFile
成功读取文件内容之后,文件依然会被正确关闭,防止资源泄漏。
- 当函数
-
发生错误:
- 如果在
os.Open
时发生错误,函数会直接返回错误。但由于defer
语句的特性,file.Close()
依然会被执行。然而,因为os.Open
失败,file
为nil
,Go语言中对nil
的文件对象调用Close
方法是安全的,不会导致程序崩溃,依然能确保不会因为未关闭文件而造成资源泄漏。 - 如果在
os.ReadFile
时发生错误,函数同样会返回错误。但在返回之前,defer
语句(即file.Close()
)会先执行,关闭之前打开的文件,保证资源的正确释放。
- 如果在