问题描述
如果我运行此代码:
package main
import "os"
func pass() bool { return false }
func main() {
f,e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
}
我得到了这个结果:
The process cannot access the file because it is being used by another process.
如果我这样做,我会得到预期的结果:
defer f.Close()
if ! pass() {
f.Close()
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
但我想尽可能避免重复的 Close()
。文件总是
需要关闭,但如果某些功能失败,也需要删除。是更好的方法
可用于我正在尝试做什么?回复评论:该文件将是
从多个 HTTP 请求写入。它可能的第一个请求可以通过,
第二个请求失败。
解决方法
如果这种情况经常出现,那就创建一个辅助函数:
func nuke(f *os.File) {
name := f.Name()
f.Close()
if err := os.Remove(name); err != nil {
panic(err)
}
}
像这样使用它:
func main() {
f,e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
nuke(f)
}
}
,
这似乎是我想要的:
package main
import (
"errors"
"os"
)
func main() {
f,err := os.Create("file.txt")
if err != nil {
panic(err)
}
defer func() {
f.Close()
if err != nil {
os.Remove(f.Name())
}
}()
err = errors.New("fail")
}
程序按原样关闭并删除文件。如果我删除最后一行, 仅关闭文件。