异常都是靠recover捕捉来恢复的
正常退出的监听, os/signal, 请。
以下只是对于 ctrl + c 的信号捕捉示例

package main

import ( 
    "fmt" 
    "os" 
    "os/signal" 
)

func main() { 
    c := make(chan os.Signal) 
    signal.Notify(c)

    //signal.Notify(c, syscall.SIGHUP, syscall.SIGUSR2)  //监听指定信号

    s := <-c //阻塞直至有信号传入 
    fmt.Println("get signal:", s) 
}