Gin 源码阅读(一)

初始化 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值