gin框架路由组源码剖析

2022/5/23 1:05:48

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


扫一扫关注最新编程教程