Gin是目前最流行,性能最好的的GoWeb框架,几乎成为了学习GoWeb必备的知识。本人最近也在学Gin,在b站搜了很多教程,发现有的教程不够详细,有的教程工具包安装有问题,而官方文档的很多示例代码又不全,不容易实现,于是我就想,能不能通过问ChatGPT来弥补这点?毕竟我们是学技术的,与时俱进才是常态,学习方法也是一样。所以,一套基于官方文档和ChatGPT的Gin教程就诞生了!本教程的目的是学会快速使用框架的各种功能,而不是剖析代码,毕竟框架就是为了方便他人使用而诞生的。换句话说,本教程只负责让官方示例代码怎么跑起来,而不介绍示例涉及的各种概念,这些百度下或者用多了自然会知道。废话不多说,让我们开启Gin学习之旅吧!
官方项目地址:https://github.com/gin-gonic/gin
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:本文不设目录,因为每一节都是循序渐进的。
一、知识点分类
官方文档的示例部分列出的知识点很多,共44个,但不分顺序,所以看起来错综复杂。实际上,这些知识点可以划分为几个大类,本人将其划分为七大类,每个知识点都附上了原文链接:
1. 数据渲染(共7个知识点)
AsciiJSON
HTML渲染
JSONP
PureJSON
SecureJSON
XML/JSON/YAML/ProtoBuf 渲染
多模板
2. 请求参数处理(共15个知识点)
模型绑定和验证
Multipart/Urlencoded 绑定
Multipart/Urlencoded 表单
绑定 HTML 复选框
绑定 Uri
绑定表单数据至自定义结构体
绑定查询字符串或表单数据
将 request body 绑定到不同的结构体中
查询字符串参数
上传文件
设置和获取 Cookie
映射查询字符串或表单参数
只绑定 url 查询字符串
Query 和 post form
从 reader 读取数据
3. 路由与中间件(共6个知识点)
路由参数
路由组
使用中间件
自定义中间件
不使用默认的中间件
在中间件中使用 Goroutine
4. 日志与安全(共6个知识点)
定义路由日志的格式
如何记录日志
控制日志输出颜色
安全页眉
使用 BasicAuth 中间件
使用 HTTP 方法
5. 静态文件与资源管理(共2个知识点)
静态文件服务
静态资源嵌入
6. 服务器与高级功能(共5个知识点)
HTTP2 server 推送
优雅地重启或停止
运行多个服务
支持 Let’s Encrypt
重定向
7. 自定义与配置(共3个知识点)
自定义 HTTP 配置
自定义日志文件
自定义验证器
以下是对这七类的大致介绍:
-
数据渲染
数据渲染是将数据格式化为可在前端展示的形式。这一类知识点涵盖了如何生成不同格式的响应数据,如 JSON、HTML、XML 等,确保后端数据能够以用户友好的方式呈现给客户端。 -
请求参数处理
请求参数处理涉及如何从客户端请求中提取和解析数据。这包括处理 POST 和 GET 请求中携带的各种数据,如表单数据、查询字符串等。了解如何绑定和验证这些请求参数是实现数据交互的关键。 -
路由与中间件
路由和中间件是构建 Web 应用程序的核心部分。路由负责将请求映射到相应的处理函数,而中间件则提供了一种机制,可以在请求处理的生命周期中执行特定的功能,如身份验证、日志记录等。 -
日志与安全
这一类知识点关注于应用程序的安全性和可维护性。包括记录日志、设置安全头部、实现用户认证等。这些措施可以帮助开发者监控应用的运行状态,及时发现和解决潜在问题。 -
静态文件与资源管理
静态文件和资源管理主要涉及如何处理静态文件(如 HTML、CSS、JavaScript 和图像文件)以及如何将这些文件嵌入到应用中。有效的静态资源管理可以提高应用的性能和用户体验。 -
服务器与高级功能
这一类知识点涵盖了服务器的配置和高级功能,如支持 HTTP2、优雅地重启服务器、使用 Goroutine 实现并发处理等。这些功能可以增强应用的性能和可扩展性。 -
自定义与配置
自定义与配置涉及如何根据项目需求调整和扩展 Gin 框架的功能。包括自定义 HTTP 配置、日志管理和验证器等,允许开发者根据特定需求进行灵活配置,提高开发效率和代码的可读性。
二、初始化工作区
本教程使用工作区机制来管理项目,需要Go1.18及以上版本,具体介绍见golang必备管理方法,这里已经给大家写好了建立工作区的程序。
首先创建一个文件夹作为工作区,然后创建main.go,填充代码:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// 定义文件夹名称
folderNames := []string{
"第一个Gin应用", "数据渲染", "请求参数处理", "路由与中间件",
"日志与安全", "静态文件与资源管理", "服务器与高级功能", "自定义与配置",
}
// 创建文件夹并初始化 Go 模块
for i, name := range folderNames {
// 生成文件夹名称
folderName := fmt.Sprintf("%02d%s", i, name)
// 创建文件夹
err := os.Mkdir(folderName, os.ModePerm)
if err != nil {
fmt.Printf("创建文件夹 %s 失败: %v\n", folderName, err)
continue
}
// 切换到新创建的文件夹
err = os.Chdir(folderName)
if err != nil {
fmt.Printf("切换到文件夹 %s 失败: %v\n", folderName, err)
continue
}
// 初始化 Go 模块,模块名为序号
modName := fmt.Sprintf("%02d", i)
cmd := exec.Command("go", "mod", "init", modName)
if err := cmd.Run(); err != nil {
fmt.Printf("初始化模块 %s 失败: %v\n", modName, err)
} else {
fmt.Printf("成功创建文件夹 %s 并初始化模块 %s\n", folderName, modName)
}
// 切换回原始目录
os.Chdir("..")
}
// 初始化工作区并添加所有项目
cmd := exec.Command("go", "work", "init")
out, err := cmd.CombinedOutput() // 捕获输出
if err != nil {
fmt.Printf("初始化工作区失败: %v\n输出: %s\n", err, out)
return
}
// 添加所有项目到工作区
for i := range folderNames {
folderName := fmt.Sprintf("%02d%s", i, folderNames[i])
cmd = exec.Command("go", "work", "use", folderName)
if err := cmd.Run(); err != nil {
fmt.Printf("添加 %s 到工作区失败: %v\n", folderName, err)
} else {
fmt.Printf("成功将 %s 添加到工作区\n", folderName)
}
}
}
执行上述代码后,会得到8个文件夹(项目),这样的话,其中一个项目下载包,其余项目就无需重复下载。
三、第一个Gin应用
cd到00目录,执行如下命令,安装gin框架:
go get -u github.com/gin-gonic/gin
创建main.go,填充代码:
package main
import (
"github.com/gin-gonic/gin" // 引入 Gin 框架
)
func main() {
// 创建一个默认的 Gin 路由引擎实例
r := gin.Default()
// 定义一个 GET 请求的路由
// 第一个参数是请求的路径,第二个参数是处理该请求的函数
r.GET("/ping", func(c *gin.Context) {
// 使用 JSON 格式返回响应,状态码为 200,内容为 {"message": "pong"}
c.JSON(200, gin.H{
"message": "pong",
})
})
// 启动服务,监听在 0.0.0.0:8080 上
// 这里的 0.0.0.0 表示接受来自任何 IP 的请求
// 如果你将第一个参数写为 "/",则可以直接输入 `localhost:8080` 后按回车访问
r.Run() // 启动服务
// 注意:启动程序后,它将一直监听指定的端口,不会主动结束。
// 如果你对代码进行修改,需要先结束当前程序,方法可以是在命令行中按 Ctrl+C,或者在 IDE 中选择关闭程序。
}
执行程序,打开浏览器(以Chrome浏览器为例),输入localhost:8080/ping
,回车,效果如下:
特别注意:启动程序后,它将一直监听指定的端口,不会主动结束。如果你对代码进行修改,需要先结束当前程序,方法可以是在命令行中按 Ctrl+C,或者在 IDE 中选择关闭程序。