使用 defer 和指针

假设我有以下代码:


func getConnection(fileName string) *os.File {

    file, err := os.Open(fileName)

    //Check for error

    return file

}

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


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



犯罪嫌疑人X
浏览 162回答 1
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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go