初始化 Engine 对象
从官方提供的 demo
代码来逐行解析 gin
源码架构
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run(":9999")
首先是 gin.Default()
,如下
func Default() *Engine {
// debug 信息
debugPrintWARNINGDefault()
// 返回了一个 Engine 结构体对象
engine := New()
// engine 使用两个全局中间件
// 第一个是 logger,核心功能是通过 fmt.Fprint(out, formatter(param)) 来输出日志
// 第二个是 recovery,核心功能是通过 defer func() { if err := recover(); err != nil { ... } } 来处理 panic 错误
// 并将 panic 类型的错误转化为 500 服务器错误抛出 c.AbortWithStatus(http.StatusInternalServerError)
// go 的 recover() 函数可以捕获抛出的 panic 类型错误
engine.Use(Logger(), Recovery())
return engine
}
// New 函数返回一个默认配置的 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: make(methodTrees, 0, 9),
delims: render.Delims{
Left: "{
{", Right: "}}"},
secureJsonPrefix: "while(1);",
}
// 依赖注入
engine.RouterGroup