| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | package httpimport (	"context"	"github.com/gin-gonic/gin"	"log"	"net/http"	"os"	"os/signal"	"syscall"	"time")func Run(r *gin.Engine, addr string) {	srv := &http.Server{		Addr:    addr,		Handler: r,	}	// Initializing the server in a goroutine so that	// it won't block the graceful shutdown handling below	go func() {		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {			log.Fatalf("listen: %s\n", err)		}	}()	// Wait for interrupt signal to gracefully shutdown the server with	// a timeout of 5 seconds.	quit := make(chan os.Signal, 1)	// kill (no param) default send syscall.SIGTERM	// kill -2 is syscall.SIGINT	// kill -9 is syscall.SIGKILL but can't be catch, so don't need add it	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)	<-quit	log.Println("Shutting down server...")	// The context is used to inform the server it has 5 seconds to finish	// the request it is currently handling	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)	defer cancel()	if err := srv.Shutdown(ctx); err != nil {		log.Fatal("Server forced to shutdown: ", err)	}	log.Println("Server exiting")}
 |