Gin框架操作指南01:开山篇

server/2024/10/17 22:40:50/

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 配置
自定义日志文件
自定义验证器

以下是对这七类的大致介绍:

  1. 数据渲染
    数据渲染是将数据格式化为可在前端展示的形式。这一类知识点涵盖了如何生成不同格式的响应数据,如 JSON、HTML、XML 等,确保后端数据能够以用户友好的方式呈现给客户端

  2. 请求参数处理
    请求参数处理涉及如何从客户端请求中提取和解析数据。这包括处理 POST 和 GET 请求中携带的各种数据,如表单数据、查询字符串等。了解如何绑定和验证这些请求参数是实现数据交互的关键。

  3. 路由与中间件
    路由和中间件是构建 Web 应用程序的核心部分。路由负责将请求映射到相应的处理函数,而中间件则提供了一种机制,可以在请求处理的生命周期中执行特定的功能,如身份验证、日志记录等。

  4. 日志与安全
    这一类知识点关注于应用程序的安全性和可维护性。包括记录日志、设置安全头部、实现用户认证等。这些措施可以帮助开发者监控应用的运行状态,及时发现和解决潜在问题。

  5. 静态文件与资源管理
    静态文件和资源管理主要涉及如何处理静态文件(如 HTML、CSS、JavaScript 和图像文件)以及如何将这些文件嵌入到应用中。有效的静态资源管理可以提高应用的性能和用户体验。

  6. 服务器与高级功能
    这一类知识点涵盖了服务器的配置和高级功能,如支持 HTTP2、优雅地重启服务器、使用 Goroutine 实现并发处理等。这些功能可以增强应用的性能和可扩展性

  7. 自定义与配置
    自定义与配置涉及如何根据项目需求调整和扩展 Gin 框架的功能。包括自定义 HTTP 配置、日志管理和验证器等,允许开发者根据特定需求进行灵活配置,提高开发效率和代码的可读性。

二、初始化工作区

本教程使用工作区机制来管理项目,需要Go1.18及以上版本,具体介绍见golang必备管理方法,这里已经给大家写好了建立工作区的程序。
首先创建一个文件夹作为工作区,然后创建main.go,填充代码:

package mainimport ("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 mainimport ("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 中选择关闭程序。


http://www.ppmy.cn/server/132600.html

相关文章

linux中将普通用户添加到系统白名单中

打开 sudoers文件,在Allow root to run any commands anywhere 后面 添加一条(把上面的一条内容复制下来 修改用户名即可)

85 外网用户通过域名访问内网服务器

1. 组网需求 某公司内部对外提供Web服务,Web服务器地址为10.110.10.2/24。 该公司在内网有一台DNS服务器,IP地址为10.110.10.3/24,用于解析Web服务器的域名。 该公司拥有两个外网IP地址&#x…

【Python爬虫】看电影还在用VIP?一个python代码让你实现电影自由!附源码

今日主题 如何用Python解析vip电影。 什么是vip电影? 这些vip电影啊,想要观看的话,必须充值会员,否则没法看。 比如这个: 这些vip电影解析后呢? 不需要会员,不需要登录,可以直接…

第十二章 RabbitMQ之失败消息处理策略

目录 一、引言 二、RepublishMessageRecoverer 实现 2.1. 实现步骤 2.2. 实现代码 2.2.1. 异常交换机队列回收期配置类 2.2.2. 常规交换机队列配置类 2.2.3. 消费者代码 2.2.4. 消费者yml配置 2.2.5. 生产者代码 2.2.6. 生产者yml配置 2.2.7. 运行效果 一、引言 …

Pr 音频效果快速参考(合集 · 2025版)

Adobe Premiere Pro 中提供了丰富的音频效果,帮助用户在视频编辑过程中调整和增强音频质量。这些音频效果涵盖了振幅与压限、延迟与回声、滤波器与 EQ、调制、降噪/恢复、混响、特殊效果、立体声声像、时间与变调等多个类别。通过合理使用这些效果,可以提…

iOS 大数相乘

首先说清楚2个概念: 概念1.一个M位数 与一个N位数 相乘,乘积的位数一定小于等于(NM). 如.2数99 乘以 4位数 9999, 其结果为 989901 ,为24 6位数. 上面的概念很重要,因为我们要创建一个初始值都为0, 元素个数为(MN) 的数组, 例如:99x918,我们需要创建23的元素的resultArray[0,…

网站集群批量管理-Ansible-进阶

1. 流程控制 1.1 handlers触发器 应用场景: 1. 一般用于分发配置文件的时候 2. 如果配置文件发生变化则重启服务,如果没有变化则重启 3. 注意事项: handlers放在剧本的最后,否则都会被识别为handlers 没有使用触发器handlers - hosts: alltasks:- name: 分发文件copy:src: /e…

[含文档+PPT+源码等]精品基于Python实现的flask专家管理系统[包运行成功+永久免费答疑辅导]

基于Python实现的Flask专家管理系统的背景,可以从以下几个方面进行详细阐述: 一、专家资源管理的重要性 在现代社会中,各领域专家资源对于推动科技进步、解决复杂问题以及提升决策质量等方面具有不可替代的作用。然而,传统的专家…