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