Heim  >  Artikel  >  Backend-Entwicklung  >  So kapseln Sie Routing in Golang

So kapseln Sie Routing in Golang

尚
Original
2020-03-27 15:25:333112Durchsuche

So kapseln Sie Routing in Golang

Kapselungsmethode 1. Das Routing wird in die Hauptfunktion geschrieben und die anfängliche Verbindung zur Datenbank wird in der Funktion init() platziert. ,

So kapseln Sie Routing in Golang

Erster Blick auf main.go

Eine Initialisierungsfunktion, DB initialisieren

func init() {
   db.Connect()
   }

Zweitens Routing

func main() {

   // Configure
   router := gin.Default()

   // Set html render options
   htmlRender := GinHTMLRender.New()
   htmlRender.Debug = gin.IsDebugging()
   htmlRender.Layout = "layouts/default"
   // htmlRender.TemplatesDir = "templates/" // default
   // htmlRender.Ext = ".html"               // default

   // Tell gin to use our html render
   router.HTMLRender = htmlRender.Create()

   router.RedirectTrailingSlash = true
   router.RedirectFixedPath = true

   // Middlewares
   router.Use(middlewares.Connect)
   router.Use(middlewares.ErrorHandler)

   // Statics
   router.Static("/public", "./public")

   // Routes

   router.GET("/", func(c *gin.Context) {
      c.Redirect(http.StatusMovedPermanently, "/articles")
   })

   // Articles
   router.GET("/new", articles.New)
   router.GET("/articles/:_id", articles.Edit)
   router.GET("/articles", articles.List)
   router.POST("/articles", articles.Create)
   router.POST("/articles/:_id", articles.Update)
   router.POST("/delete/articles/:_id", articles.Delete)

   // Start listening
   port := Port
   if len(os.Getenv("PORT")) > 0 {
      port = os.Getenv("PORT")
   }
   router.Run(":" + port)
}

Kapselungsmethode 2: Route und DB werden einzeln in eine Funktion gekapselt und die Route wird in Form von Parametern an eine andere Funktion übergeben.

So kapseln Sie Routing in Golang

func SetUpServer() {
	r := gin.Default()

	// secret 相当于签名
	store, _ := sessions.NewRedisStore(10, "tcp", CONFIG.Redis.Host, CONFIG.Redis.Password, []byte(CONFIG.Server.Secret))
	r.Use(sessions.Sessions("session", store))

	r.Use(gin.Recovery())
	r.Use(Uniquify())

	r.LoadHTMLGlob("templates/*")
	r.Static("/static", "public/")

	SetUpRoutes(r)

	r.GET("/incr", func(c *gin.Context) {
		c.JSON(200, gin.H{"count": c.MustGet("key").(string)})
	})

	// var port string

	r.Run(":" + CONFIG.Server.Port)
}

Kapselung 3. Kapseln Sie Routing usw. in die Serverstruktur. Hierzu erstellt der Server eine neue Funktion und Routing und andere verwandte Inhalte sind nur in der Methode enthalten.

So kapseln Sie Routing in Golang

type Server struct {
	Ws     *melody.Melody
	Routes *gin.Engine
	Games  []*Game
}

func New() *Server {
	ws := melody.New()
	routes := gin.Default()
	games := make([]*Game, 0)

	return &Server{
		Ws:     ws,
		Routes: routes,
		Games:  games,
	}
}


...
...


func (srv *Server) RoutesInit() {
	srv.Routes.GET("/jq.js", func(c *gin.Context) {
		http.ServeFile(c.Writer, c.Request, "html/jq.js")
	})

	srv.Routes.GET("/goyaniv.js", func(c *gin.Context) {
		http.ServeFile(c.Writer, c.Request, "html/goyaniv.js")
	})
	srv.Routes.GET("/game/:name", func(c *gin.Context) {
		cookiekey, _ := c.Request.Cookie("goyanivkey")
		cookieid, _ := c.Request.Cookie("goyanivid")
		if cookieid == nil || cookiekey == nil {
			cookieid := CreateCookie("goyanivkey", GenerateUnique())
			cookiekey := CreateCookie("goyanivid", GenerateUnique())
			http.SetCookie(c.Writer, cookieid)
			http.SetCookie(c.Writer, cookiekey)
		}
		http.ServeFile(c.Writer, c.Request, "html/game.html")
	})
	srv.Routes.GET("/gamedev/:name", func(c *gin.Context) {
		cookiekey, _ := c.Request.Cookie("goyanivkey")
		cookieid, _ := c.Request.Cookie("goyanivid")
		if cookieid == nil || cookiekey == nil {
			cookieid := CreateCookie("goyanivkey", GenerateUnique())
			cookiekey := CreateCookie("goyanivid", GenerateUnique())
			http.SetCookie(c.Writer, cookieid)
			http.SetCookie(c.Writer, cookiekey)
		}
		http.ServeFile(c.Writer, c.Request, "html/gamedev.html")
	})

	srv.Routes.GET("/game/:name/ws", func(c *gin.Context) {
		srv.Ws.HandleRequest(c.Writer, c.Request)
	})

	srv.Routes.GET("/gamedev/:name/ws", func(c *gin.Context) {
		srv.Ws.HandleRequest(c.Writer, c.Request)
	})

	srv.Ws.HandleMessage(func(s *melody.Session, msg []byte) {
		FireMessage(srv, s, msg)
	})

	srv.Ws.HandleDisconnect(func(s *melody.Session) {
		FireDisconnect(srv, s)
	})

	srv.Ws.HandleConnect(func(s *melody.Session) {
		FireConnect(srv, s)
	})
}

func (s *Server) Run() {
	s.RoutesInit()
	s.Routes.Run(":5000")
}

Weitere Golang-Kenntnisse finden Sie in der Spalte Golang-Tutorial auf der chinesischen PHP-Website.

Das obige ist der detaillierte Inhalt vonSo kapseln Sie Routing in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn