golang如何封装路由


本文摘自php中文网,作者尚,侵删。

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

1.jpg

首先看 main.go

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

1

2

3

func init() {

   db.Connect()

   }

第二,路由

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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函数,路由等相关内容只包含在方法中。

3.jpg

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

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知识请关注PHP中文网golang教程栏目。

以上就是golang如何封装路由的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

go url

golang中如何比较字符串是否相等

golang并发模式之扇入fan-in和扇出fan-out

[系列] - go-gin-api 路由中间件 - jaeger 链路追踪(六)

golang怎么判断map是否为空

go语言中slice作为参数传递时遇到的一些“坑”

golang的优势是什么

golang单元测试踩坑系列(一)

go 里面 [...]string{"a", "b", "c"} 加三个点是什么骚写法?

如何实现golang语言的多态

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...