概述
通过日常对gin场景出发,深入源码,总结介绍gin的核心设计。包含:Engine / HandlerFunc / RouterGroup(Router) / Context。在日常使用中常见的就以上概念,汇总如下:
从DEMO开始
type barForm struct {
Foo string `form:"foo" binding:"required"`
Bar int `form:"bar" binding:"required"`
}
func (fooHdl FooHdl) Bar(c *gin.Context) {
var bform = new(barForm)
if err := c.ShouldBind(bform); err != nil {
// true: parse form error
return
}
// handle biz logic and generate response structure
// c (gin.Context) methods could called to support process-controling
c.JSON(http.StatusOK, resp)
// c.String() alse repsonse to client
}
// mountRouters .
func mountRouters(engi *gin.Engine) {
// use middlewares
engi.Use(gin.Logger())
engi.Use(gin.Recovery())
// mount routers
group := engi.Group("/v1")
{
fooHdl := demohtp.New()
group.GET("/foo", fooHdl.Bar)
group.GET("/echo", fooHdl.Echo)
// subGroup := group.Group("/subg")
// subGroup.GET("/hdl1", fooHdl.SubGroupHdl1) // 最终路由:"targetURI = /v1/subg/hdl1"
}
}
func main() {
engi := gin.New()
mountRouters(engi)
if err := engi.Run(":8080"); err != nil {
log.Fatalf("engi exit with err=%v", err)
}
}
通过上述的代码就简单开启了一个gin server,其中就包括了常见的:路由注册,中间件注册,路由分组,服务启动。核心概念也就是刚刚在上文提到的那四个概念。概览流程如下图:
可以参照DEMO中的方法名在图中检索改流程。
Engine
// Engine is the framework's instance, it contains the muxer, middleware and configuration settings.
type Engine struct {
// 路由管理
RouterGroup
// 省略非关心属性
// ...
// context poo,支持context复用,减少对象创建提高性能。
pool sync.Pool
// []methodTree方法树根节点集合 这部分在路由部分会详细介绍
trees methodTrees
}
Engine是根入口,它把RouterGroup结构图体嵌入自身,以获得了Group,GET,POST等路由管理方法。从 Run
方法的代码:
因为直接复制代码太多了,推荐下载源码来跳转,更便捷高效。
func (engine *Engine) Run(addr ...string) (err error) {