功能失败时删除文件

Remove file on function failure

如果我运行这个代码:

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)
   }
}