1、使用channel优雅地关闭服务
package mainimport ("context""fmt""net/http""os""os/signal""syscall""time"
)func IndexHandler(w http.ResponseWriter, r *http.Request) {if r.Method != http.MethodGet {return}_, _ = fmt.Fprintf(w, "测试", "")
}func initRouters() {http.HandleFunc("/", IndexHandler)
}func main() {initRouters()srv := http.Server{Addr: ":8081",}go func() {err := srv.ListenAndServe()if err != nil {return}}()quit := make(chan os.Signal)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)<-quit ctx, cancle := context.WithTimeout(context.Background(), 2*time.Second)defer cancle()if err := srv.Shutdown(ctx); err != nil {fmt.Println("Shutdown err:", err)}fmt.Println("Shutdown")
}
2、使用channel实现超时保护机制
package mainimport ("fmt""time"
)
func timeouting() {timeout := time.After(1 * time.Second) ch := make(chan bool)go func() {time.Sleep(time.Second * 2)ch <- true}()select {case <-ch:fmt.Println("程序在1秒内启动")case <-timeout:fmt.Println("程序启动超时,请重新启动")}
}func main() {timeouting()
}