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 项目了。

相关推荐
a11177610 分钟前
SLAM 学习笔记(三)视觉里程计2(VO) 特征点法
人工智能·笔记·学习
Yang_jie_0315 分钟前
笔记:数据结构(循环队列相关判断条件)
数据结构·笔记
三品吉他手会点灯18 分钟前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
鱼子星_1 小时前
【C++】类和对象(下)——初始化列表,类型转换,static成员,友元,内部类,匿名对象,编译器的优化拓展
c语言·c++·笔记
千寻xun10 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
Piko61415 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
AOwhisky16 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
Piko61417 小时前
锐捷交换机 DHCP Server部署
运维·网络·笔记
取地址符18 小时前
Rust学习笔记(基于Rustlings)(2):数据结构与集合
笔记·学习·rust
A.零点18 小时前
期末复习,408考研数据结构:第一章绪论完整知识梳理与真题深度解读
c语言·数据结构·笔记·考研