package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" ) func main() { stop := make(chan os.Signal) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) ctx, cancel := context.WithCancel(context.Background()) defer cancel() srv := http.Server{ Addr: fmt.Sprintf(":%d", 8080), } go func() { log.Println("running listener") if err := srv.ListenAndServe(); err != nil { log.Fatal(err) } }() <-stop log.Printf("shutting down server") srv.Shutdown(ctx) log.Printf("server gracefully stopped") }