有没有办法退出 Go 程序,但执行所有挂起的 defer 语句?
我一直在使用 defer 清理临时文件,但是当程序被 Ctrl+C 甚至 os.Exit 中断时,不会执行延迟的语句。
用 Ctrl+C 退出这个程序后,foo.txt 和 bar.txt 都留下了:
package main
import (
"fmt"
"io/ioutil"
"os"
"os/signal"
"syscall"
)
func main() {
ioutil.WriteFile("./foo.txt", []byte("foo"), 0644)
defer os.RemoveAll("./foo.txt")
go func() {
ioutil.WriteFile("./bar.txt", []byte("bar"), 0644)
defer os.RemoveAll("./bar.txt")
for {
// various long running things
}
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
signal.Notify(c, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Received OS interrupt - exiting.")
os.Exit(0)
}()
for {
// various long running things
}
}
墨色风雨
呼唤远方
相关分类