小编典典

对指针使用延迟

go

让我们说我有以下代码:

func getConnection(fileName string) *os.File {
    file, err := os.Open(fileName)
    //Check for error
    return file
}

我使用此函数打开文件,然后从执行其他活动的另一个函数调用该函数。

我的问题是,既然我已经打开文件,如何关闭它。如果要在defer file.Close()里面添加getConnection()文件,在返回之前是否会关闭文件?在调用函数中使用defer是否有意义?


阅读 226

收藏
2020-07-02

共1个答案

小编典典

如果函数的目的是返回文件,为什么要在返回文件的函数中将其关闭?

在这种情况下, 调用者 有责任正确关闭文件,最好使用defer

func usingGetConnection() {
    f := getConnection("file.txt")
    defer f.Close()
    // Use f here
}

尽管您的getConnection()函数吞没了错误,但是您应该使用多次返回值来指示类似以下问题:

func getConnection(fileName string) (*os.File, error) {
    file, err := os.Open(fileName)
    //Check for error
    if err != nil {
        return nil, err
    }
    return file, nil
}

并使用它:

func usingGetConnection() {
    f, err := getConnection("file.txt")
    if err != nil {
        panic(err) // Handle err somehow
    }
    defer f.Close()
    // Use f here
}
2020-07-02