错误检查后放置延迟

时间:2018-04-29 22:21:02

标签: go

在Go中,人们经常会看到以下习语:

func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}

错误检查后出现defer语句有什么理由吗?我的猜测是这样做是为了避免在nil不是err的情况下取消引用nil值。

1 个答案:

答案 0 :(得分:1)

如果文件OpenCreate失败,则您无法关闭有效*File。问题不会是nil的{​​{1}}值,因为*File()将检查Close并在这种情况下立即返回 - 问题可能是nil值为非零但无效。由于*File的文档没有明确说明对os.Open()的失败调用返回Open()的nil值,因此您无法依赖它的所有底层实现事实返回零值或总是返回零值。