package main
import (
"fmt"
"io"
"os"
)
func processFile(filePath string, resultChan chan<- error) {
file, err := os.Open(filePath)
if err != nil {
resultChan <- err
return
}
defer func() {
if err := file.Close(); err != nil {
resultChan <- err
}
}()
// 模拟数据处理
_, err = io.ReadAll(file)
if err != nil {
resultChan <- err
return
}
resultChan <- nil
}
解释如何避免资源泄漏
- 使用
defer
语句:在成功打开文件后,使用defer
关键字定义了一个匿名函数,该函数负责关闭文件。defer
会在函数返回之前执行,无论函数是正常返回还是因为错误而返回,都能保证文件被关闭,从而避免资源泄漏。
- 错误处理:在打开文件和读取文件数据的过程中,一旦发生错误,立即将错误通过通道返回,并直接
return
结束当前goroutine
,确保后续逻辑不会干扰错误处理和文件关闭操作。这样,在任何可能出错的点都能及时处理并关闭文件资源,防止资源泄漏。
调用示例
func main() {
resultChan := make(chan error)
go processFile("nonexistentfile.txt", resultChan)
err := <-resultChan
close(resultChan)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("File processed successfully")
}
}