前言
gin的路由拆分,实际就是路由模块化分组。使用路由拆分的目的在于提高代码的可读性。在简单的案例中,可以将代码都写入到一个文件中,或者几个文件中。随着项目功能逐渐加多,又没有合理的分层分组,可读性会因代码增加而越来越低。路由拆分实际也是一种代码的模块化管理方式(主要对于路由的管理)。
包管理
go中一个文件夹为一个包。项目根目录为main
,main
包是无法给同一项目下的其他包引用的
这里使用demo作为项目名
文件内package的命名
如果是项目根目录,使用main
,其余的文件使用所在的那个文件夹名称,不能写入完整的目录层级。例如/service/blogdir/blog.go
文件(第一个斜杠表示项目根目录即main目录),package使用package blogdir
引用的起点
引用的起点是从项目名开始,按目录层级写到功能所在文件夹。例如/service/blogdir/blog.go
,blog.go
中有一个SayHello()
方法。
引用使用:
import("demo/service/blog")
// 略...
blog.SayHello()
// 略...
gin路由拆分
没有规定一定使用哪种分层,每种合适路由拆分方式都有它的适用场景。我这里使用用gva(gin-vue-admin)
的路由划分思路。
目录结构如下
所有的enter.go
作用是将本目录下的所有包整合到enter.go
中,以便外部引用。
添加一个路由
-
在
api/v1
中定义一个处理方法,传入的参数为gin.Context
(为了方便这里就不加入enter
中)// \api\v1\demo.go package v1 import ( "fmt" "github.com/gin-gonic/gin" ) type DemoController struct { } func (dc *DemoController) Demo(c *gin.Context) { fmt.Println("demo") }
-
定义一个路由,添加到
enter
中// \router\example\demo.go package example import ( v1 "github.com/flipped-aurora/gin-vue-admin/server/api/v1" "github.com/gin-gonic/gin" ) type DemoRouter struct{} func (d *DemoRouter) InitDemoRouter(r *gin.RouterGroup) { // 可以添加组和中间件(r.Use()) r.Group("demo") DemoController := &v1.DemoController{} // 绑定路由和处理方法 /demo/demo01 r.GET("demo01",DemoController.Demo) r.POST("demo02",DemoController.Demo) // ... }
-
将绑定好的路由组添加到当前
enter.go
文件中,目的是为了整合当前文件夹中的所有路由
// router\example\enter.go
- (按需)如果是新的文件夹,需要再上一层,找到enter文件,加新文件中的
enter.go
中的结构体加入其中。
-
最后在初始化的时候注册所有路由、绑定中间件等
// initialize\router.go
-
启动项目,在浏览器中访问
{地址}/demo/demo01
,控制台会得到:demo
说明路由生效了。
通过继承减少方法的层级
刚定义的路由包裹的层级是这样的:RouterGroup.RouterGroup.DemoRouter.InitDemoRouter()
前两个RouterGroup
是上两级目录下的enter.go
路由整合文件。
![]() | ![]() |
---|
(/router/example
) RouterGroup
中继承了当前文件夹中的所有类。所以在上一级(/router
下)的RouterGroup
,通过Example
属性就可以直接访问到/router/example
下的所有路由初始化方法。这样就减少了多层级的方法访问。
gva的拆分是否过于麻烦?
在写这篇博客前我在想gva
的路由划分实在太麻烦,多个enter.go
文件叠加让人觉得眼花缭乱。如果在router文件夹下
只使用一个go
文件来整合路由,路由分组再另外使用一个文件夹划分,层级上就只有一级。这样好像更加的简洁。如下:
看起来是简洁了, 但是当路由的数量增多后,一个文件n行的初始化;文件内容太多,还是要面临继续拆分的问题,最终可能还是回到了gva这种拆分方式.
开发中没有银弹
总结
路由拆分实际是一种代码的模块化管理方式。每种合理的拆分的方式都有其适用的场景。选择适合的拆分方式,提高项目的可读性