package main
import (
"fmt"
"os"
)
func readFileContent(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
var content []byte
content, err = os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(content), nil
}
defer与错误处理协同工作解释
- 打开文件:首先使用
os.Open
尝试打开文件,如果打开文件时发生错误(如文件不存在),函数直接返回错误,此时defer
语句不会执行,因为函数提前返回了。
- defer语句:在成功打开文件后,使用
defer
关键字注册file.Close()
语句。defer
会在当前函数返回(无论是正常返回还是因错误返回)时执行。这确保了无论后续读取文件过程中是否发生错误,文件都会被关闭。
- 读取文件:接着使用
os.ReadFile
读取文件内容,如果读取过程中发生错误,函数返回错误,但此时defer
注册的file.Close()
语句依然会执行,保证文件资源的正确释放。
不同错误情况下defer语句执行情况
- 文件打开错误:如文件不存在、权限不足等,
os.Open
返回错误,函数直接返回,defer
注册的关闭文件语句不会执行,因为还未进入到defer
注册语句之后的代码。
- 文件读取错误:文件成功打开,但在
os.ReadFile
读取时发生错误,函数返回错误,此时defer
注册的file.Close()
语句会执行,确保文件关闭,避免资源泄漏。