Gin项目简单使用 | 青训营笔记

119 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。项目中路由是可重可轻的部分,而Gin的轻量使不喜欢臃肿的人在路由方面有了不二选择。

Gin在项目中的简单使用

1.快速启动

配和Go语言写服务器的简单,加入Gin的入口文件也比较简单。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    //不使用recovery()等中间件可使用gin.New()
    router := gin.Default()
    /*具体路由占位*/
    router.Run(":8080")
}

2.路由

路由可以根据项目大小、路由复杂程度进行拆分,防止入口文件和路由文件过于臃肿。路由由构造出的路由前缀树进行维护。

//静态资源定位
router.Static("/static/", "./static/")
//分组路由和中间件使用
g := router.Group("/project")
{
    needMiddleware := g.Group("",middlewareMethod) //func middlewareMethod(c *gin.Context) {}
    {
        needMiddleware.GET("/get/", controller.GetIndex) //func GetIndex(c *gin.Context) {}
        needMiddleware.POST("/set/", controller.SetIndex) //func SetIndex(c *gin.Context) {}
    }
}
//Respone example: c.String(http.StatusOK, "test")

3.流程控制

从入口开始存在着函数调用链,使用计数来跟踪和控制调用链。在使用中间件时,就比较容易遇到中间件使用后无法中断的情况,此时需要分清调用链调用函数的区别,从而更好地跳出调用流程的坑,不会想执行的执行不到,不想执行的无法提前截止。

func (c *Context) Next() {
	c.index++
	for c.index < int8(len(c.handlers)) {
		c.handlers[c.index](c)
		c.index++
	}
}

func (c *Context) Abort() {
	c.index = abortIndex
}

上面是两个常用的流程控制函数。Next()是挂起继续执行后面,Abort()是挂起并且放弃执行后面,源码中效果就是Abort()直接将计数置为最大值从而控制流程。最常见的两种情况:a.中间件挂起后还是走到了业务层并且执行了一次完整请求,此时便可以考虑是否将需要用Abort()的地方没有用Abort()停止请求向后走。b.中间件挂起后直接没有将请求向后面层次调用,可以考虑是否误将二者混用。