Gin 是一个轻量级 HTTP Web 框架,封装了路由、参数绑定、中间件等功能,性能较高,适合开发 RESTful API。
性能高
基于 httprouter
零内存分配路由(zero allocation)
比较接近原生 net/http
中间件机制完善
支持参数绑定和验证
不适合复杂大型项目
Context过于强劲
基础用法#
最小demo示例:引入库+启动一个监听接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
// 用默认中间件创建路由
r := gin.Default()
// 定义一个简单的get请求接口
r.GET("/ping", func(c *gin.Context) {
// 返回JSON响应
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
// 默认启动在8080端口
r.Run()
}
|
最基本用法
1
2
| r := gin.Default()
r.Run(":8080")
|
路由
1
2
3
4
5
6
7
8
9
10
11
| //基础路由
r.GET("/user", handler)
r.POST("/user", handler)
r.PUT("/user/:id", handler)
r.DELETE("/user/:id", handler)
//分组路由
api := r.Group("/api")
{
api.GET("/users", getUsers)
api.POST("/users", createUser)
}
|
参数获取
1
2
3
4
5
6
7
8
9
10
11
| //Query参数
name := c.Query("name")
//Path参数
id := c.Param("id")
//Json参数
type User struct {
Name string `json:"name"`
}
var u User
c.ShouldBindJSON(&u)
|
返回数据
1
2
3
| c.JSON(200, gin.H{
"msg": "ok",
})
|
中间件
1
2
3
4
5
6
7
8
| //日志为例
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("before")
c.Next()
fmt.Println("after")
}
}//c.Abort()中断请求
|
错误处理
1
2
3
| c.AbortWithStatusJSON(400, gin.H{
"error": "bad request",
})
|
绑定校验
1
2
3
4
5
6
7
8
| type User struct {
Name string `json:"name" binding:"required"`
}
if err := c.ShouldBindJSON(&u); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
|
自定义中间件
1
2
3
4
5
6
7
8
9
10
| func Auth() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token == "" {
c.AbortWithStatus(401)
return
}
c.Next()
}
}
|
文件上传
1
2
| file, _ := c.FormFile("file")
c.SaveUploadedFile(file, "./"+file.Filename)
|