在Go的Web开发里,如果你想写得快,又跑得快,那么Gin框架几乎是必学的框架之一,官网地址(gin-gonic.com/zh-cn/), 如图
本文将带你快速入门Gin,掌握它的核心能力:路由、中间件、性能优势。1、安装Gin直接在代码里导入Gin,Go会在构建时自动下载
import "github.com/gin-gonic/gin"
2、创建一个Gin服务
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
// 创建带默认中间件(日志与恢复)的 Gin 路由器
r := gin.Default()
// 定义简单的 GET 路由
r.GET("/ping", func(c *gin.Context) {
// 返回 JSON 响应
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
// 默认端口 8080 启动服务器
// 监听 0.0.0.0:8080(Windows 下为 localhost:8080)
r.Run()
}
运行应用:2.1 将上述代码保存为main.go2.2 运行应用
go run main.go
2.3 打开浏览器访问http://localhost:8080/ping 2.4 您应看到:{"message":"pong"}3、Gin的路由
路由是 Gin 的核心之一,让你用最直观的方式组织 API。
3.1 基本GET/POST路由
r.GET("/ping", pingHandler)
r.POST("/users", addUserHandler)
3.2 路径参数
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "用户ID是 %s", id)
})
3.3 查询参数
r.GET("/search", func(c *gin.Context) {
keyword := c.Query("q")
c.JSON(200, gin.H{"keyword": keyword})
})
3.4 路由分组(敲黑板)
// 路由分组用于API版本管理、角色权限、模块划分
v1 := r.Group("/api/v1")
{
v1.GET("/users", listUsers)
v1.POST("/users", addUser)
}
4、Gin的中间件 4.1 定义一个中间件
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("token")
if token != "不能说的秘密" {
c.JSON(401, gin.H{"error": "认证失败"})
c.Abort() // 中断后续处理
return
}
c.Next() // 继续执行后续 handler
}
}
4.2 使用自定义的中间件
v1 := r.Group("/api/v1")
// 给路由分组应用中间件
v1.Use(AuthMiddleware())
{
v1.GET("/users", listUsers)
v1.POST("/users", addUser)
}
// 单独加中间件
r.GET("api/v2/users",AuthMiddleware(),func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "认证通过,可以获得用户列表了",
})
})
5、Gin和net/http对比
| 能力 | net/http | Gin |
|---|---|---|
| 性能 | 高 | 更高 |
| 路由 | 手动写或第三方 | 内置路由 |
| JSON处理 | 手写编码 | c.JSON一键输出 |
| 中间件 | 自己封装 | 内置+可扩展 |
| 错误恢复 | 无,需要自己写 | 内置Recovery |
| API写法 | 相对底层 | 简洁优雅 |
6、实战一下
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",
})
})
v1 := r.Group("/api/v1")
v1.Use(AuthMiddleware())
{
v1.GET("/users", func(ctx *gin.Context) {
//其他业务逻辑
ctx.JSON(200, "user list")
})
v1.POST("/users", func(ctx *gin.Context) {
//其他业务逻辑
ctx.JSON(200, "添加成功")
})
}
r.Run(":8080")
}
func AuthMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
token := ctx.GetHeader("token")
if token != "不能说的秘密" {
ctx.JSON(401, gin.H{"error": "认证失败"})
ctx.Abort() // 中断后续处理
return
}
ctx.Next() // 继续执行后续 handler
}
}
运行输出:
$ go run .
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] GET /api/v1/users --> main.main.func2 (4 handlers)
[GIN-debug] POST /api/v1/users --> main.main.func3 (4 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080
Gin就像复兴号:运行稳定、速度极快、线路清晰(路由),还能根据需要加装不同车厢和服务(中间件)。人一旦坐上了高铁,就能又快又稳地抵达目标。
源码地址
1、公众号“Codee君”回复“每日一Go”获取源码
如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!