ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

gin框架路由组源码剖析

2022-05-22 12:03:35  阅读:200  来源: 互联网

标签:group func 源码 user context 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
}

 */

标签:group,func,源码,user,context,gin,路由
来源: https://www.cnblogs.com/mayanan/p/16297513.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有