假设我有以下代码:
func getConnection(fileName string) *os.File {
file, err := os.Open(fileName)
//Check for error
return file
}
我使用此函数打开一个文件,并且从执行其他一些活动的另一个函数调用该函数。
我的问题是,现在我已经打开了文件,如何关闭它。如果我要添加defer file.Close()
inside getConnection()
,返回之前不会关闭文件吗?在调用函数中使用 defer 有意义吗?
如果函数的目的是返回文件,为什么要在返回文件的函数中关闭它?
在这种情况下,责任方是caller正确关闭文件,最好使用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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)