上手gin | 青训营笔记

96 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

先跑起来再说

去年寒假就听闻gin的大名了,前几天初步了解了一下,今天就记录一下当做复习吧。

go get -u github.com/gin-gonic/gin 然后import导入即可。

package main
​
import "github.com/gin-gonic/gin"func main() {
    r := gin.Default()              // 返回一个默认的Engin
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "hello":"world",
        })
    })
    r.Run(":8080")       
}

r := gin.Default() 使用默认的的Engin,向其中注册/路由,跑在8080端口。

type H map[string]interface{} gin已经提前帮我们声明好了一个map,方便我们使用。

啪的一下,很快呀,看到这,我已经上手了。写Node的经验告诉我,下一步就是,写中间件,分组,挂载,写处理函数。

一模一样呀。先往后看。

参数

  r.GET("/users/:id", func(c *gin.Context) {
    id := c.Param("id") 
    c.String(200, "The user id is %s", id)
  })

很强大,/users/身份也能匹配上。/users/上的获取的id就会为空。*号参数,不建议使用,当做没看到。

实现的原理也和Express差不多,都是在一个request对象里获取的,只不过在go里,request对象在Context中。

查询参数前,会先从调用c.getQueryCache() ,缓存所有的键值对,提高性能,下次再取别的键就会很快。

还有QueryArrayQueryMap,会自动从查询参数中转换成数组或map。

下面是查询参数方法的列表,对于表单和查询参数都封装地很一致。API非常友好。

查询参数Form表单说明
QueryPostForm获取key对应的值,不存在为空字符串
GetQueryGetPostForm多返回一个key是否存在的结果
QueryArrayPostFormArray获取key对应的数组,不存在返回一个空数组
GetQueryArrayGetPostFormArray多返回一个key是否存在的结果
QueryMapPostFormMap获取key对应的map,不存在返回空map
GetQueryMapGetPostFormMap多返回一个key是否存在的结果
DefaultQueryDefaultPostFormkey不存在的话,可以指定返回的默认值

路由分组

func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) RouterGroup

可以看到Group返回的还是一个RouterGroup,所以嵌套下来能形成一个个的分组,类似于树的结构。

第一个参数是相对路径,第二个参数是处理函数。

    v1Group := r.Group("/v1")
    {
        v1Group.GET("/users", func(c *gin.Context) {
            c.String(200, "/v1/users")
        })
        v1Group.GET("/products", func(c *gin.Context) {
            c.String(200, "/v1/products")
        })
    }

自定义中间件

这就是一种洋葱圈模型,也可以理解为Spring的那种AOP,不过AOP是站在对象执行方法的角度,这里是站在处理路由的角度。我们就可以很轻易的实现一个v1请求的日志了

v1 := r.Group("api/v1", func(context *gin.Context) {
        fmt.Println("请求v1")
    })
{
    user := v1.Group("/user")
    .....
}

实现鉴权也很简单,直接插入一个鉴权中间件,检查token,选择c.Abort()或者c.Next()放行