# 16.3 发生错误时使用 defer 关闭一个文件

如果你在一个 `for` 循环内部处理一系列文件，你需要使用 `defer` 确保文件在处理完毕后被关闭，例如：

```go
for _, file := range files {
    if f, err = os.Open(file); err != nil {
        return
    }
    // 这是错误的方式，当循环结束时文件没有关闭
    defer f.Close()
    // 对文件进行操作
    f.Process(data)
}
```

但是在循环内结尾处的 `defer` 没有执行，所以文件一直没有关闭！垃圾回收机制可能会自动关闭文件，但是这会产生一个错误，更好的做法是：

```go
for _, file := range files {
    if f, err = os.Open(file); err != nil {
        return
    }
    // 对文件进行操作
    f.Process(data)
    // 关闭文件
    f.Close()
 }
```

**`defer` 仅在函数返回时才会执行，在循环内的结尾或其他一些有限范围的代码内不会执行。**

## 链接

- [目录](directory.md)
- 上一节：[误用字符串](16.2.md)
- 下一节：[何时使用 new() 和 make()](16.4.md)
