Gin框架

* 本页面主要介绍Gin框架的相关内容。

Gin 是一个基于 Go 语言编写的 Web 框架,与 martini 框架类似,但拥有更好的性能,借助高性能的 httprouter,速度提升了近 40 倍。如果你追求高性能和开发效率,你会爱上 Gin 框架。

Gin框架
Gin框架
Gin有哪些特性?
  • 快速:基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能
  • 支持中间件:传入的 HTTP 请求可以由一系列中间件和最终操作来处理。 例如:Logger,Authorization,GZIP,最终操作 DB
  • Crash 处理:Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic!
  • JSON 验证:Gin 可以解析并验证请求的 JSON,例如检查所需值的存在
  • 路由组:更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能
  • 错误管理:Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。
  • 内置渲染:Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。

这么好用,怎么开始用呢?

Gin安装和使用

安装Gin之前,可以检查下本地使用的Go版本,尽量是 Go 1.11 及以上版本 (Go modules 要求)。 然后按照下面的流程安装即可:

  //下载安装
  $ go get -u github.com/gin-gonic/gin

  //引入到项目中
  import "github.com/gin-gonic/gin"

  //(可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包
  import "net/http"

  //简单程序示例
  package main

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

  func main() {
      r := gin.Default()
      r.GET("/ping", func(c *gin.Context) {
          c.JSON(200, gin.H{
              "message": "pong",
          })
      })
      r.Run() 
  }
Gin全局错误处理:Crash

Gin的其他使用问题这里不再详细总结,可以在 《凯冰科技移动应用开发手册》 里面找到更加详细和实用的总结分享,因为整个系统是采用的Gin框架开发的。这里,我重点总结下这个实用的Crash如何来使用。

其实我们可以把这个定义成一个中间件,然后使用它。

  package handler

  import (
    "awesomeProject/Result"
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
    "runtime/debug"
  )

  func Recover(c *gin.Context) {
    defer func() {
      if r := recover(); r != nil {
        //打印错误堆栈信息
        log.Printf("panic: %v\n", r)
        debug.PrintStack()
        //封装通用json返回
        //c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
        //Result.Fail不是本例的重点,因此用下面代码代替
        c.JSON(http.StatusOK, gin.H{
          "code": "1",
          "msg":  errorToString(r),
          "data": nil,
        })
        //终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码
        c.Abort()
      }
    }()
    //加载完 defer recover,继续后续接口调用
    c.Next()
  }

  // recover错误,转string
  func errorToString(r interface{}) string {
    switch v := r.(type) {
    case error:
      return v.Error()
    default:
      return r.(string)
    }
  }
  func main() {
    router := gin.Default()
    //注意 Recover 要尽量放在第一个被加载
    //如不是的话,在recover前的中间件或路由,将不能被拦截到
    //程序的原理是:
    //1.请求进来,执行recover
    //2.程序异常,抛出panic
    //3.panic被 recover捕获,返回异常信息,并Abort,终止这次请求
    router.Use(handler.Recover)

    router.GET("/ping", func(c *gin.Context) {
      // 无意抛出 panic
      var slice = []int{1, 2, 3, 4, 5}
      slice[6] = 6
    })

    router.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")

  }

Gin框架的知识就总结到这里,你了解了吗?


* 本页内容参考以下数据源:

  • https://gin-gonic.com/docs/
  • https://gin-gonic.com/
  • https://blog.csdn.net/u014155085/article/details/106733391
  • https://learnku.com/docs/gin-gonic/2019

凯冰科技 · 代码改变世界,技术改变生活
Next Page→