gin源码阅读【1】-gin.Engine

用了这么久的gin了,对他的源代码还没怎么去看过。一方面是我做golang是半路出家,对golang不是以前弄php那么一目了然,直接了当,再一个没哪个闲情。趁有空,撸起来。

最近公司把我闲置了,不知道是部门要变动还是要给我大礼包,管他的,蹭不忙,阅读一下gin的源代码吧。

gin版本:v1.9.1

golang版本: go1.21.4

说到gin很多人肯定一开始都是如下这一段代码

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

首先就来看gin.Default,实际返回的是一个gin.Engine,先从这个struct开始吧。

type Engine struct {
  RedirectTrailingSlash bool
  RedirectFixedPath bool
  HandleMethodNotAllowed bool
  ForwardedByClientIP bool
  AppEngine bool  # 已经废弃
  UseRawPath bool
  UnescapePathValues bool
  RemoveExtraSlash bool
  RemoteIPHeaders []string
  TrustedPlatform string
  MaxMultipartMemory int64
  UseH2C bool
  ContextWithFallback bool
  delims           render.Delims
  secureJSONPrefix string
  HTMLRender       render.HTMLRender
  FuncMap          template.FuncMap
  allNoRoute       HandlersChain
  allNoMethod      HandlersChain
  noRoute          HandlersChain
  noMethod         HandlersChain
  pool             sync.Pool
  trees            methodTrees
  maxParams        uint16
  maxSections      uint16
  trustedProxies   []string
  trustedCIDRs     []*net.IPNet
}

一个个的来看解释吧。

RouterGroup 路由组,一看及时一个大活儿,晚点来看吧。它里面主要就是gin路由那一套,刨个坑,这个留到后面来看吧

RedirectTrailingSlashru 官方解释,开启的话,比如 /foo/ 不存在但是有 foo,就会301跳转到 /foo。感觉这个方式不好,如果是接口访问的话,client端拿到一个301是不好处理的。

RedirectFixedPath 是否修复路径,比如 /FOO 和 /..//Foo 可以重定向到 /foo,里面一堆判断。也是返回一个301,这种不友好的方式。

HandleMethodNotAllowed 405支持,如果开启的话,如果路由不存在,但是对应的路由的其他方法存在,比如GET /foo 不存在,但是POST /foo 存在,则放回一个405,不然就给一个404 NotFound

ForwardedByClientIP 和获取IP相关的,获取IP里面独逻辑还是比较复杂,后面的文章专门来写吧。

UseRawPath 意思是如果开启的话,带有%的原始路径会用来传递参数。

UnescapePathValues 也是转义相关的

RemoteIPHeaders ForwardedByClientIP为真的情况下,会从这个这个当中的值作为header的key来取IP,很适用于那种经过多次,转来转去找不到iP,要从header从获取的情况。

TrustedPlatform 也是和获取客户端IP相关的。

MaxMultipartMemory 设置request的最大内存值。

发布于
标记为