调用debugPrintWARNINGDefault(),跟进
runtime.Version获取golang运行时版本号,getMinVer返回版本号尾数(例getMinVer("go1.7"),返回7),ginSupportMinGoVer常量是当前框架的支持最小版本号。
调用debugPrint(),跟进
os.Stderr是一个文件流,指向标准输出,该函数主要功能就是把传入的string写到标准输出里。
调用IsDebugging(),跟进
返回ginMode变量和debugCode常量的比较结果。
调用New(),跟进
初始化一个Engine结构体,并返回该结构体
调用debugPrintWARNINGNew(),跟进
向标准输出里打印一段话。
调用allocateContext(),跟进
返回结构体给Engine初始化。
调用engine.Use(Logger(), Recovery()),跟进
注释的意思是给engine附加中间件,附加到每个请求的执行链条中。
调用engine.RouterGroup.Use(middleware...),跟进
给engine.RouterGroup.Handlers添加处理函数。
调用engine.rebuild404Handlers(),跟进
调用处理并将返回值放入engine这个结构体字段allNoRoute中,依然是在初始化。
调用engine.combineHandlers(engine.noRoute),跟进
finalSize的值是engine.RouterGroup.Handlers处理函数的个数加上传入函数的个数,int(abortIndex)的值是63,如果finalSize大于等于63,就抛出异常信息"too many handlers",翻译过来为“太多的处理程序”,如果小于63,就直接把所有的函数全部返回出去。
调用engine.rebuild405Handlers(),跟进
返回值放入engine.allNoMethod中。
调用engine.combineHandlers(engine.noMethod),跟进
和engine.rebuild404Handlers()调用的是同一个子函数,只是传入的参数不一样。
完成解析。以下对该函数处理过程做一个总结:
1.先判断golang运行时的版本号是否小于gin框架指定的版本号,然后根据是否小于打印不同的提示信息到标准输出(windows下可以理解为控制台输出)。
2.然后直接打印一段提示信息:`[WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
`。
3.然后初始化一个Engine对象。(由于该结构体较大,所以这里就不给出详细说明了,可以自己参阅gin源码。这里只贴出一张截图。)
4.然后往engine.RouterGroup.Handlers里面添加两个HandlerFunc函数对象,一个是打印日志的,一个是抛出错误的。
5.往engine.allNoRoute和engine.allNoMethod里面放入两个长度小于63的[]HandlerFunc实例,[]HandlerFunc里面的值是分别用engine.noRoute+engine.RouterGroup.Handlers,engine.noMethod+engine.RouterGroup.Handlers填充的。
6.返回engine结构体。
有疑问加站长微信联系(非本文作者)