7.Gin 路由详解 - 路由分组 - 路由文件抽离
前言
在前面的示例中,我们直接将路由的定义全部写在 main.go
文件中,如果后面 路由越来越多,那将会越来越不好管理。
所以,下一步我们应该考虑将路由进行分组管理,并且将其抽离 main.go
的文件。
1696330394289
路由分组
我们可以将相同模块路径的作为一组,将路由进行分组处理。
1696330862506
go
// 2.1 路由分组
// 设置根路径的路由分组
defaultRouter := r.Group("default/")
{
// c.HTML 渲染模板
defaultRouter.GET("index", func(c *gin.Context) {
// 创建对象
userInfo := UserInfo{
Name: "李白",
Age: 30,
Gender: "male",
}
// 渲染模板
c.HTML(http.StatusOK, "default/index.html", gin.H{
"title": "default前台首页",
"userInfo": userInfo,
"score": 60,
"hobby": []string{"吃饭", "睡觉", "写代码"},
"now": time.Now(),
"str1": "hello",
"str2": "world",
})
})
}
adminGroup := r.Group("admin")
{
adminGroup.GET("index", func(c *gin.Context) {
c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})
})
adminGroup.GET("goods", func(c *gin.Context) {
c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})
})
}
为了简单示例,我只是简单分了两个路由组,一个是 default
,另一个是 admin
的路由组。
测试如下:
- 访问
default
组的index
路由:http://localhost:8000/default/index
1696330950278
- 访问
admin
组的index
路由:http://localhost:8000/admin/index
1696330979558
从效果来看,我们可以将相同模块的路由进行分组,但是还是写在main.go
代码文件中,下面我们将路由的内容抽离到其他文件。
路由文件抽离
不管是路由分组、还是普通的路由,我们都可以通过单独编写函数,抽离到其他模块去,避免路由代码全部写在 main.go
代码中。
下面我们来简单示例一下。
新建 routes 文件夹,并且按照不同的模块,创建不同的路由管理文件
1696331864037
以 AdminRouterInit
方法作为示例:
go
package routes
import (
"github.com/gin-gonic/gin"
"net/http"
)
// AdminRouterInit Admin路由分组
func AdminRouterInit(r *gin.Engine) {
// 设置admin路由
adminRouter := r.Group("admin")
{
adminRouter.GET("index", func(c *gin.Context) {
c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})
})
adminRouter.GET("goods", func(c *gin.Context) {
c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})
})
}
}
在上面通过函数入参,将 r *gin.Engine
传入函数方法中,然后用来定义路由信息。
在 main.go
初始化路由
1696331972771
go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"go-gin-pratice/routes"
"html/template"
"time"
)
// 定义时间格式转换的方法
func formatAsDate(t time.Time) string {
year, month, day := t.Date()
return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}
// 定义打印信息的方法
func printlnMsg(str1 string, str2 string) string {
return fmt.Sprintf("%s.....%s", str1, str2)
}
func main() {
// 1.创建路由
r := gin.Default()
//注册全局模板函数 注意顺序,注册模板函数需要在加载模板上面
r.SetFuncMap(template.FuncMap{
"formatDate": formatAsDate,
"printlnMsg": printlnMsg,
})
// 加载模板文件
r.LoadHTMLGlob("templates/**/*")
// 定义静态文件路径
r.Static("/static", "static")
// 2.绑定路由规则,执行的函数
// gin.Context,封装了request和response
// 2.1 初始化路由
routes.DefaultRouterInit(r)
routes.AdminRouterInit(r)
routes.RootRouterInit(r)
// 3.监听端口,默认在8080
// 监听并在 0.0.0.0:8080 上启动服务
// Run("里面不指定端口号默认为8080")
r.Run(":8000")
}
测试效果
1696332022586
抽离了路由代码后,接口还是可以正常访问的,说明路由初始化正常。