一、什么是 Gin
Gin 是 Go 语言中最常用的 Web 框架之一。
特点:
- 轻量
- 性能高
- 路由简单
- 开发速度快
很多 Go 后端项目都会使用 Gin。
安装:
bash
go get -u github.com/gin-gonic/gin
二、第一个 Gin 程序
创建 main.go
go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "hello gin")
})
r.Run()
}
运行:
bash
go run main.go
浏览器访问:
txt
http://localhost:8080
三、Gin 核心对象
1. gin.Default()
go
r := gin.Default()
作用:
创建一个默认路由引擎。
里面默认带了:
- 日志中间件
- panic恢复中间件
开发里基本都直接用它。
2. 路由
go
r.GET()
r.POST()
r.PUT()
r.DELETE()
分别对应:
| 方法 | 作用 |
|---|---|
| GET | 查询 |
| POST | 新增 |
| PUT | 修改 |
| DELETE | 删除 |
示例:
go
r.GET("/user", func(c *gin.Context) {
})
r.POST("/user", func(c *gin.Context) {
})
3. Run()
go
r.Run()
默认启动:
txt
8080端口
等价于:
go
r.Run(":8080")
指定端口:
go
r.Run(":9090")
四、返回数据
1. 返回字符串
go
r.GET("/", func(c *gin.Context) {
c.String(200, "hello")
})
2. 返回 JSON(重点)
开发里最常用。
go
r.GET("/user", func(c *gin.Context) {
c.JSON(200, gin.H{
"name": "张三",
"age": 18,
})
})
返回:
json
{
"name":"张三",
"age":18
}
3. 返回 HTML
go
c.HTML()
后面配合模板使用。
五、获取请求参数
1. 获取 Query 参数
URL:
txt
/user?id=1&name=zhangsan
代码:
go
r.GET("/user", func(c *gin.Context) {
id := c.Query("id")
name := c.Query("name")
c.JSON(200, gin.H{
"id": id,
"name": name,
})
})
2. 获取路径参数
路由:
go
r.GET("/user/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, id)
})
访问:
txt
/user/100
输出:
txt
100
3. 获取 POST 表单参数
go
r.POST("/login", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
c.JSON(200, gin.H{
"username": username,
"password": password,
})
})
六、接收 JSON 数据
前端发送:
json
{
"name":"张三",
"age":18
}
定义结构体:
go
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
接收:
go
r.POST("/user", func(c *gin.Context) {
var user User
c.BindJSON(&user)
c.JSON(200, user)
})
这个开发里特别常见。
七、路由分组
项目大了以后:
路由不能全写一起。
Gin 支持分组。
go
userGroup := r.Group("/user")
{
userGroup.GET("/list", func(c *gin.Context) {
})
userGroup.POST("/add", func(c *gin.Context) {
})
}
最终路由:
txt
/user/list
/user/add
八、中间件(重点)
中间件本质:
在请求前后执行一些公共逻辑。
比如:
- 日志
- 登录校验
- JWT鉴权
- 权限验证
1. 定义中间件
go
func Middleware() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("请求前")
c.Next()
fmt.Println("请求后")
}
}
2. 使用中间件
全局使用:
go
r.Use(Middleware())
3. 路由使用中间件
go
r.GET("/user", Middleware(), func(c *gin.Context) {
})
九、文件上传
go
r.POST("/upload", func(c *gin.Context) {
file, _ := c.FormFile("file")
c.SaveUploadedFile(file, "./"+file.Filename)
c.String(200, "上传成功")
})
十、重定向
go
r.GET("/a", func(c *gin.Context) {
c.Redirect(302, "/b")
})
十一、模板渲染
加载模板:
go
r.LoadHTMLGlob("templates/*")
返回页面:
go
r.GET("/", func(c *gin.Context) {
c.HTML(200, "index.html", gin.H{
"title": "首页",
})
})
十二、Gin 项目结构
小项目:
txt
project
│
├── main.go
真实项目一般:
txt
project
│
├── controller
├── service
├── dao
├── model
├── router
├── middleware
├── config
├── main.go
十三、Gin + MySQL
Go 里面一般会搭配:
- Gin
- Gorm
- MySQL
形成完整后端。
安装 Gorm:
bash
go get gorm.io/gorm
MySQL 驱动:
bash
go get gorm.io/driver/mysql
十四、常见状态码
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 404 | 资源不存在 |
| 500 | 服务器错误 |
| 401 | 未登录 |
| 403 | 无权限 |
十五、完整小案例
go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
name := c.Query("name")
c.JSON(200, gin.H{
"msg": "hello " + name,
})
})
r.Run(":8080")
}
访问:
txt
http://localhost:8080/hello?name=zjl
返回:
json
{
"msg":"hello zjl"
}
十六、Gin 核心总结
Gin 最核心的内容:
txt
路由
参数获取
JSON返回
中间件
路由分组
真正开发里:
最常写的其实就是:
go
r.GET()
r.POST()
c.JSON()
c.Query()
c.Param()
c.BindJSON()
把这些掌握以后:
基本已经能开始写 Go Web 项目了。