解决 "可能发生资源泄漏,在 'for' 循环中调用 'defer' "的提示

4 min read

在使用 defer 语句时,通常会在函数结束时执行某些清理操作,以确保资源被正确释放。但是,如果在一个 for 循环中使用 defer 语句,可能会导致资源泄漏。

这是因为 defer 语句会在函数结束时才执行,而在 for 循环中,如果函数每次迭代都创建了一个需要清理的资源,但在函数结束前 defer 语句并不会执行,那么这些资源就会被泄漏。

解决这个问题的方法是将 defer 语句移动到循环体内部,以确保资源在每次迭代后都被及时释放。例如:

for i := 0; i < 10; i++ {
    f, err := os.Open("file.txt")
    if err != nil {
        return err
    }
    defer f.Close()
    // do something with f
}

在这个例子中,每次迭代都会打开一个文件,然后在循环结束时调用 f.Close() 来清理文件句柄。通过将 defer 语句移动到循环体内部,我们确保文件句柄在每次迭代后都得到了正确的释放。