热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang如何封装路由

golang封装路由的方法:1、路由写在main函数中,数据库初始连接放在init()函数中。2、路由和db单独封装到一个函数中,以传参的形式将路由传给另一个函数。

首先看 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单独封装到一个函数中,以传参的形式将路由传给另一个函数。

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

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

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

更多golang知识请关注golang教程栏目。

以上就是golang如何封装路由的详细内容,更多请关注其它相关文章!


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
author-avatar
Xlady贩卖__铺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有