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  }