goframe 的动态路由的底层数据结构是由层级哈希表和双向链表构建的路由树。gin 路由算法是前缀树(Trie), 时间复杂度是 O(n)。
可参考 gin的路由算法
当gin出现路由规则重复时,会报错。而goframe则是按照深度优先策略进行优先级控制。主要规则如下:
gin和goframe都支持命名匹配规则、模糊匹配规则,不建议使用模糊匹配规则,容易引起冲突。
gin 不支持 goframe中的字段匹配规则,但实际上也可以做到类似效果
路由匹配参考文档
goframe路由管理-路由规则
gin路由规则
本节gin示例代码:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/:name", func(c *gin.Context) {
c.String(200, c.FullPath())
})
r.GET("/:name/update", func(c *gin.Context) {
c.String(200, c.FullPath())
})
r.GET("/:name/:action", func(c *gin.Context) {
c.String(200, c.FullPath())
})
r.GET("/:name/*any", func(c *gin.Context) {
c.String(200, c.FullPath())
}) //因与上面规则产生冲突,go run 时报错
// r.GET("/:name/list/{field}.html", func(c *gin.Context) {
// c.String(200, c.FullPath())
// }) //暂不支持该匹配模式,可采用下面这种模式代替
r.GET("/:name/hello-:action", func(c *gin.Context) {
c.String(200, c.FullPath())
})
r.Run()
}
本节goframe示例代码:
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/:name", func(r *ghttp.Request) {
r.Response.Writeln(r.Router.Uri)
})
s.BindHandler("/:name/update", func(r *ghttp.Request) {
r.Response.Writeln(r.Router.Uri)
})
s.BindHandler("/:name/:action", func(r *ghttp.Request) {
r.Response.Writeln(r.Router.Uri)
})
s.BindHandler("/:name/*any", func(r *ghttp.Request) {
r.Response.Writeln(r.Router.Uri)
})
s.BindHandler("/user/list/{field}.html", func(r *ghttp.Request) {
r.Response.Writeln(r.Router.Uri)
})
s.SetPort(8199)
s.Run()
}
goframe 路由注册有函数注册和对象注册两种,并支持分组路由
可参考 goframe路由注册文档
gin 在小型项目情况下,可简单使用类似函数注册的方法,当项目规模变大后,可以对路由进行拆分,形成单独的文件或者包。这时,可以在单独的文件中,完成路由注册工作。当项目继续膨胀,可以通过定义多个路由文件来注册路由。
如果项目规模实在太大,可以根据业务线拆分路由,将代码拆分到多个文件中,并利用Include函数注册子模块中定义的路由,利用Init函数初始化路由。
可参考 gin路由拆分与注册
goframe 和 gin 都支持路由分组功能
路由分组可以更加高效的管理一系列URL,诸如统一前缀,鉴权校验,错误处理等,建议使用。
goframe 和 gin 都可以通过在路由组中添加中间件,来添加诸如鉴权,日志记录等特性。goframe还可以通过HOOK的方式注册路由。
[goframe分组路由文档](https://goframe.org/pages/viewpage.action?pageId=1114479)
goframe HOOK事件回调
gin路由分组
原理类似aop,亦或者,虽然gin将其描述为middleware,但个人认为称呼为拦截器更加合适。
goframe和gin都有全局中间件和局部中间件的概念,能实现的功能类似。
下面goframe中间件的文档中,有5个中间件示例,分别是,允许跨域请求、请求鉴权处理、鉴权例外处理、统一的错误处理、自定义日志处理,均是常用中间件的范例,值得一看。
goframe中间件文档
goframe中间件设计
gin中间件文档