How to encapsulate routing in golang

Release: 2020-03-27 15:25:33
Original
3123 people have browsed it

How to encapsulate routing in golang

Encapsulation method 1. The routing is written in the main function, and the initial connection to the database is placed in the init() function. ,

How to encapsulate routing in golang

First look at main.go

An initialization function to initialize db

func init() {
   db.Connect()
   }
Copy after login

Second, 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)
}
Copy after login

Encapsulation method 2: Route and DB are individually encapsulated into a function, and the route is passed to another function in the form of parameters.

How to encapsulate 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)
}
Copy after login

Encapsulation 3. Encapsulate routing, etc. into Server struct. For this, Server creates a new function, and routing and other related content are only included in the method.

How to encapsulate 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")
}
Copy after login

For more golang knowledge, please pay attention to the golang tutorial column on the PHP Chinese website.

The above is the detailed content of How to encapsulate routing in golang. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template