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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

冒泡排序.

文章目录 🍊自我介绍🍊冒泡排序排序过程图解 🍊冒泡排序代码 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是…

【HTML】构建网页的基石

我的主页:2的n次方_ HTML 是一种超文本标记语言,不仅有文本,还能包含图片,音频等 1. HTML 的文件基本结构 html 标签是整个 html 文件的最顶层标签,head 标签中写页面的属性,body 标签是页面中显示的…

idea2024年版本

最简单安装2024.2版本idea 内带安装教程 ** 下载链接:https://pan.quark.cn/s/ab24afbaa43f 提取码:KHrq

Tauri(读音:踹你)开发简介:1.创建和运行第一个app

桌面app与web app之间的界限越来越模糊,以前可能说基于web编写的app性能不好,但是现在我们来看,不管钉钉还是vscode,都是采用了Electron框架,以web模式开发出来的。 提到Electron相信许多程序员都不陌生,它…

STM32 | STM32F4OTA_ESP8266_Bootloader为引导程序远程更新的代码(APP)

更新。点击上方"蓝字"关注我们 01、思路 >>> STM32F4OTA_ESP8266_Bootloader为引导程序 远程更新的代码(APP):远程更新的APP Ymoden_server:为运行在Linux的TCP服务器 备注:STM32 OTA远程更新需要连接热点 电…

信息抽取数据集处理——RAMS

引言 RAMS数据集(RAMS:Richly Annotated Multilingual Schema-guided Event Structure)由约翰斯霍普金斯大学于2020年发布,是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件,涵盖了139种不同的事件类型和65种…

Tailwind css系列教程(二)

一、参考属性 https://tailwind.muzhifan.top/ 也可查找官方网站 以下为参考官网及网络上其他文章内容整理: 二、常用属性格式 1、颜色 color:颜色名称 shade:色度,取值范围为 100~900,不可对黑色或白色使用 文…

极化基变化后的散射矩阵

极化基只旋转一次 重点:发射和接收的电磁波可以理解为,在极化基上的坐标,或者就是琼斯矢量; 其中极化基坐标的理解方式在想发射的时候好理解,回波由于多了个共轭,就想其接收到的不是坐标,而是琼…

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代,如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具,凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性,成为了众多企业和个人的首选。本文将…

unity学习笔记-Text mesh Pro

Text mesh Pro组件 组件使用的大致流程细节导入之后字体没有显示可能一 可能二 注意事项 好久没更了…最近在学习使用别人的框架进行开发,坑也不少,不过学习到了很多设计思维。 言归正传。忘了是什么是时候的版本开始,unity多了这个组件&…

nextjs项目中,使用postgres的完整案例

目的 通过此案例,可以简单快速的过一下数据库的操作,熟悉app-router这种模式下,client component和server component的两种组件中基本的接口使用。 技术栈 nextjs14.2.* app-routervercel/postgres0.10.*typescript5 重要事情说三遍1 ap…

解决visio2021与本地家庭和学生版office21不兼容问题

原因分析 office 分为 MSI(windows Installer)和C2R(即点即用版本) 两个版本。 下载对应版本 可以看这个B站哥哥的资源:https://www.bilibili.com/read/cv17513800/ ,选择标准离线版本安装

[单master节点k8s部署]37.微服务(一)springCloud 微服务

微服务架构的一个重要特点是,它与开发中使用的具体编程语言或技术栈无关。每个微服务都可以使用最适合其功能需求的语言或技术来实现。例如,一个微服务可以用Java编写,另一个微服务可以用Python、Go、Node.js等编写。微服务架构允许这种灵活性…

基于Arduino做的“鱿鱼游戏”BOSS面具,支持动作检测

这是一个结合了3D打印、舵机、PIR传感器和DFPlayer MP3模块的DIY项目,旨在制作一个带有动画眼睛的"鱿鱼游戏"老板面具。当检测到动作时,面具的眼睛会移动并播放声音,非常适合万圣节使用。 这个项目是一个很好的起点,特…

又一支付机构“经营异常”——易极付

近日,支付行业再次传出风波,重庆易极付科技有限公司(简称“易极付”)因“失联”问题被重庆两江新区市场监督管理局列入了经营异常名录。据天眼查平台显示,这一决定是基于“通过登记的住所或者经营场所无法联系”到该公…

【CSS in Depth 2 精译_050】7.3 CSS 响应式设计中的流式布局原则(Fluid layout)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第七章 响应式设计】(概述) 7.1 移动端优先设计原则(上篇) 7.1.1 创建移动端菜单(下篇)7.1.2 给视口添加 meta 标签&#xf…

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式

在Linux系统中,使用ImageMagick可以图片格式转换,其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工具集,它包含了许多用于图像转换的命令。 一、安装ImageMagick(如果尚未安装)&#xff1…

Python | Leetcode Python题解之第486题预测赢家

题目: 题解: class Solution:def PredictTheWinner(self, nums: List[int]) -> bool:length len(nums)dp [0] * lengthfor i, num in enumerate(nums):dp[i] numfor i in range(length - 2, -1, -1):for j in range(i 1, length):dp[j] max(num…

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…

leetcode30:串联所有单词的字串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["ab","cd","ef"], 那么 "abcdef…