Go 错误检查后延迟的放置
在围棋中,人们经常会看到以下成语:Go 错误检查后延迟的放置,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 { retu
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
语句出现在错误检查之后,有什么原因吗?我猜这样做是为了避免在err
不是nil
的情况下取消引用nil
值,如果文件打开
或创建
失败,那么您就没有有效的*文件
来关闭。问题不在于*文件的nil
值,因为Close
()将检查nil
,并在这种情况下立即返回-问题可能在于*文件的值不是nil但无效。由于os.Open()
的文档没有明确说明对Open()
的失败调用会为*文件返回一个nil值,因此您不能相信它的所有底层实现实际上都会返回一个nil值,或者总是会返回一个nil值。如果打开文件失败,就没有什么可关闭的