3 回答
TA贡献1757条经验 获得超8个赞
您可以将关闭和重命名文件放在 defer 中:
func main() {
pfile1, _ := os.Open("myfile.log")
defer func(){
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}()
...
...
}
TA贡献2039条经验 获得超7个赞
关于您的代码,我有一些不清楚的地方。
首先,为什么要在重命名文件之前打开文件?这不是os.Rename函数所要求的。该函数采用两个表示新旧文件名的字符串,不需要传递文件指针。
func main() {
...
...
os.Rename("myfile.log", "myfile1.log")
}
假设您需要更改文件内容(鉴于该ugly_solution方法似乎并非如此)并且您必须打开文件,那么为什么要推迟file.Close()?如果需要在同一方法中的某处显式调用该方法,则不必推迟该方法。简单地调用它。
func main() {
pfile1, _ := os.Open("myfile.log")
...
...
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}
TA贡献1831条经验 获得超10个赞
在您的示例中的情况
也许你想遵循这个场景:
轻松创建可识别的临时文件。
写入数据。
关闭文件。
如果成功重命名文件。
在这种情况下,您想遵循底层文件的操作系统系统操作,也许您只想不推迟关闭 IO.file ,因为您希望得到关闭函数本身返回的错误。
此外,在这种情况下,您可能也想操作 file.sync()。
见https://www.joeshaw.org/dont-defer-close-on-writable-files/
- 3 回答
- 0 关注
- 125 浏览
添加回答
举报