package main import ( "context" "fmt" "io" "log" "net/http" "os" "os/signal" "time" ) func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { _, _ = io.WriteString(w, "hello world\n") }) server := &http.Server{ Addr: ":8888", } go func() { err := server.ListenAndServe() if err != nil && err != http.ErrServerClosed { log.Print(err.Error()) // exit } }() <-ctx.Done() ctx, cancel := context.WithTimeout(context.Background(), time.Second) cancel() if err := server.Shutdown(ctx); err != nil { log.Print(err.Error()) } fmt.Println("canceled") }