Есть ли способ выйти из программы Go, но выполнить все ожидающие заявления о приостановлении?Лучший способ удалить временные файлы
Я очищал временные файлы с помощью 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
}
}
Нет, но вы можете реорганизовать свой код, чтобы он мог закончить изящество, а затем отсрочка будет выполнена. Я рекомендую объявить 'c' в верхней части main и передать его в подпрограммы go. В стороне цикла 'for' вам нужен оператор select, который прослушивает' c', если вы получите сигнал на нем, остановите то, что вы делаете, и вернитесь. Тогда вам не нужно использовать 'os.Exit', чтобы убивать ваших goroutines (как вам никогда не нужно ...), и ваша программа может вернуться, что позволяет вашей отложенной' os.RemoveAll' очищать. – evanmcdonnal