本文主要是介绍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框架路由组源码剖析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!