github.com/glycerine/zebrapack@v4.1.1-0.20181107023619-e955d028f9bf+incompatible/slides/state-of-go/stdlib/shutdown.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "net/http" 8 "os" 9 "os/signal" 10 ) 11 12 func main() { 13 // subscribe to SIGINT signals 14 quit := make(chan os.Signal) // HL 15 signal.Notify(quit, os.Interrupt) 16 17 srv := &http.Server{Addr: ":8080", Handler: http.DefaultServeMux} 18 go func() { // HL 19 <-quit // HL 20 log.Println("Shutting down server...") 21 if err := srv.Shutdown(context.Background()); err != nil { // HL 22 log.Fatalf("could not shutdown: %v", err) 23 } 24 }() 25 26 http.HandleFunc("/", handler) 27 err := srv.ListenAndServe() 28 if err != http.ErrServerClosed { // HL 29 log.Fatalf("listen: %s\n", err) 30 } 31 log.Println("Server gracefully stopped") 32 } 33 34 func handler(w http.ResponseWriter, r *http.Request) { 35 fmt.Fprintln(w, "hello") 36 }