是否可以捕获 Ctrl+C (SIGINT) 信号并像 defer 一样执行清理函数?
大家好!我正在用 Go 编写一个小的 HTTP 服务器,它处理请求并将数据保存到文件中。当我启动服务器并按下 Ctrl+C 时,程序会立即终止,数据文件处于未完成状态。我希望在收到 SIGINT (Ctrl+C) 时,先执行清理函数(例如将数据 flush 到磁盘并关闭文件),然后程序再退出。
我知道 `defer` —— 它在函数正常结束或通过 `return` 返回时工作得很好。但如果我按下 Ctrl+C,`defer` 不会触发,因为程序直接被信号杀死了。
有没有办法捕获这个信号并以类似 `defer` 的风格执行清理逻辑?我不想写手动检查标志的临时方案。以下是我的代码示例:
```go
package main
import (
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
// 打开日志文件
f, _ := os.Create("server.log")
defer f.Close()
http