gin框架路由组源码剖析
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"reflect"
"runtime"
)
func main() {
r := gin.New()
// 1. 添加中间件
r.Use(gin.Logger(), gin.Recovery())
// 2. 405支持
r.HandleMethodNotAllowed = true
// 3. 自定义404页面
r.NoRoute(myNoRoute)
// 4. 自定义405页面
r.NoMethod(myNoMethod) // 405页面需要搭配405支持一起使用
// 5. 创建路由组
user := r.Group("user")
// 6. 获取路由组的基本路径
fmt.Println(user.BasePath())
// 7. 打印路由组的处理程程序链
for _, handler := range user.Handlers{
fmt.Println(runtime.FuncForPC(reflect.ValueOf(handler).Pointer()).Name())
}
// 8. 注册路由
user.Handle("GET", "/register", func(context *gin.Context) {
context.String(200, "这是注册页面")
})
// 9. 大杀器,不建议使用(注册一个支持所有方法的路由)
// Any 注册一个匹配所有 HTTP 方法的路由。 GET、POST、PUT、PATCH、HEAD、OPTIONS、DELETE、CONNECT、TRACE
user.Any("/any", func(context *gin.Context) {
context.String(200, "这是一个支持任何方法的路由")
})
// 10. 注册单个文件路由
//user.StaticFile("/01.png", "http_server/file/01.png")
// 11. 注册文件目录路由, 不提供文件列表
//user.Static("/static", "http_server/file/")
// 12. 注册文件目录路由,可以提供文件列表, true代表提供文件列表
user.StaticFS("/static", gin.Dir("http_server/file/", true))
user.GET("/login/:name", login)
_ = r.Run()
}
func myNoMethod(context *gin.Context) {
context.String(http.StatusMethodNotAllowed, "您请求的方法不允许")
}
func myNoRoute(context *gin.Context) {
context.String(http.StatusNotFound, "您要访问的页面不存在")
}
func login(context *gin.Context) {
context.String(200, "OK")
}
/*
routegroup.go中几个非常重要的方法
方法1:合并处理程序链
func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain {
finalSize := len(group.Handlers) + len(handlers)
if finalSize >= int(abortIndex) { // abortIndex = 32
panic("too many handlers")
}
mergedHandlers := make(HandlersChain, finalSize)
copy(mergedHandlers, group.Handlers)
copy(mergedHandlers[len(group.Handlers):], handlers)
return mergedHandlers
}
方法2:拼接绝对路径
func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
return joinPaths(group.basePath, relativePath)
}
方法3:返回Engine或RouterGroup
func (group *RouterGroup) returnObj() IRoutes {
if group.root {
return group.engine
}
return group
}
*/
分类:
gin
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)