封装方式一、路由写在 main函数中,数据库初始连接放在 init() 函数中。、

1.jpg

首先看 main.go

一个初始化函数,初始化 db

func init() {   db.Connect()   }

第二,路由

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)}

封装方式二、路由和 db单独封装到一个函数中,以传参的形式将路由传给另一个函数。

2.jpg

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 stringr.Run(":" + CONFIG.Server.Port)}

封装三、将路由等封装到 Server struct 中。对此 Server 创建一个 new函数,路由等相关内容只包含在方法中。

3.jpg

type Server struct {Ws     *melody.MelodyRoutes *gin.EngineGames  []*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")}

更多golang知识请关注PHP中文网golang教程栏目。

更多相关文章

  1. golang如何调用函数?
  2. 用go实现路由的链式定义
  3. 详解Golang中函数作为值与类型
  4. go语言中普通函数与方法的区别是什么?
  5. 详解Go 中方法与函数的区别
  6. 关于golang封装一个bash函数,用于执行bash命令
  7. 总结Golang实现PHP常用函数
  8. PHP扩展之XML操作(三)——XML解析器使用及相关函数
  9. 实例简析XPath串函数和XSLT

随机推荐

  1. ubuntu下Android源代码模块编译
  2. [Android Develop_004] Android Backgrou
  3. Android系统服务概要
  4. Android(安卓)Low Memory Killer
  5. windows 8环境—android studio初步体验(
  6. Android核心分析 之十-------Android GWE
  7. Android EditText输入光标居于开头最开始
  8. Android 中自定义View(一)
  9. android ellipsize的内容及使用
  10. Android:基础控件之(二)TextView