Gin 是一个基于 Go 语言编写的 Web 框架,与 martini 框架类似,但拥有更好的性能,借助高性能的 httprouter,速度提升了近 40 倍。如果你追求高性能和开发效率,你会爱上 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框架的知识就总结到这里,你了解了吗?