让我们说我有以下代码:
func getConnection(fileName string) *os.File { file, err := os.Open(fileName) //Check for error return file }
我使用此函数打开文件,然后从执行其他活动的另一个函数调用该函数。
我的问题是,既然我已经打开文件,如何关闭它。如果要在defer file.Close()里面添加getConnection()文件,在返回之前是否会关闭文件?在调用函数中使用defer是否有意义?
defer file.Close()
getConnection()
如果函数的目的是返回文件,为什么要在返回文件的函数中将其关闭?
在这种情况下, 调用者 有责任正确关闭文件,最好使用defer:
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 }