Gin 框架入门笔记

一、什么是 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 项目了。

相关推荐
Heartache boy2 小时前
野火STM32_HAL库版课程笔记-DWT应用与DHT11温湿度传感器
笔记·stm32·单片机·嵌入式硬件
hmbbcsm9 小时前
关于transformors库的学习笔记
笔记·学习
xqqxqxxq9 小时前
Java AI智能P图工具技术笔记
java·人工智能·笔记
FakeOccupational10 小时前
【电路笔记 PCB】Altium Designer : AD20信号完整性(Signal Integrity)分析+单线路传输分析+串扰分析(暂记)
笔记
闪闪发亮的小星星11 小时前
链路预算相关
笔记
霍霍的袁11 小时前
【初识C语言】预处理笔记(预处理指令、宏定义等)
c语言·笔记·visualstudio
dr_yingli13 小时前
慢性肾脏病评估与管理临床实践指南 KDIGO 2024 CKD 诊断指标速查手册
笔记
OBiO201313 小时前
从单细胞多组学到体内验证:器官纤维化与代谢疾病的研究新范式
笔记·学习
小清兔16 小时前
Addressable的设置打包流程
笔记·游戏·unity·c#