Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 错误检查后延迟的放置_Go - Fatal编程技术网

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值。

如果打开文件失败,就没有什么可关闭的