Avatar ·

是否可以捕获 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