gin源码
分析如下代码
func Index(c *gin.Context) { c.JSON(200, gin.H{"message":"kkkkkkkkk"}) fmt.Println("first") func main() { r := gin.Default() k := r.GET("/ping", Index) _ = k r.Run() }
1 gin.Default()如下,里面包含了New(),初始化engine的时候,它里面有属性trees,类型是type methodTrees []methodTree,这个属性之所以不放到RouterGroup里,是因为它是全局的只需有一个,并且RouterGroup里有engine,间接包含了它,
// 这个函数就是生成一个gin框架的基本对象,用于后续传入net/http进行处理, func Default() *Engine { debugPrintWARNINGDefault() // 也可以直接用New(),相当于省去了两个中间件,一个是日志输出,一个是处理异常, engine := New() engine.Use(Logger(), Recovery()) return engine } func New() *Engine { debugPrintWARNINGNew() engine := &Engine{ RouterGroup: RouterGroup{ Handlers: nil, basePath: "/", root: true, }, FuncMap: template.FuncMap{}, RedirectTrailingSlash: true, RedirectFixedPath: false, HandleMethodNotAllowed: false, ForwardedByClientIP: true, AppEngine: defaultAppEngine, UseRawPath: false, RemoveExtraSlash: false, UnescapePathValues: true, MaxMultipartMemory: defaultMultipartMemory, // trees就是个存放map的数组,key是http请求的方法名,类型为string, // values是对应生成的前缀树,每个方法生成一个,9是所有不同请求种类的个数, // 这些方法名在net/http中就定义了, trees: make(methodTrees, 0, 9), delims: render.Delims{Left: "{{", Right: "}}"}, secureJsonPrefix: "while(1);", } // 这里本质上是循环引用,这样方便后续的调用, engine.RouterGroup.engine = engine engine.pool.New = func() interface{} { return engine.allocateContext() } return engine } // 这个是为路由添加中间件的函数,传入的是个可变参数,注意本质上是添加到engine下的RouterGroup中了, func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes { engine.RouterGroup.Use(middleware...) engine.rebuild404Handlers() engine.rebuild405Handlers() return engine } func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes { group.Handlers = append(group.Handlers, middleware...) return group.returnObj() }