【基于GO的Web开发15】gin路由和路由组

一、前言

路由是 Web 服务的基础,负责将客户端的请求 URL 分发到对应的处理函数 。本篇笔记讲解 Gin 普通路由、Any匹配全部请求、404 自定义、路由分组Group,附带完整代码案例与复习要点。


二、普通基础路由

1. 常用 HTTP 请求方法路由

Gin 支持直接绑定 GETPOSTPUTDELETE 等 RESTful 常用请求方式。

表格

请求方法 作用
r.GET() 查询数据
r.POST() 新增 / 提交数据
r.PUT() 更新数据
r.DELETE() 删除数据

完整示例代码

Go 复制代码
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// GET 请求
	r.GET("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "GET",
		})
	})
	// POST 请求
	r.POST("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "POST",
		})
	})
	// PUT 请求
	r.PUT("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "PUT",
		})
	})
	// DELETE 请求
	r.DELETE("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "DELETE",
		})
	})

	r.Run(":8080")
}

💡注意:同一个路径/index可以绑定不同请求方法,视为完全不同的接口。

2. r.Any () ------ 匹配所有请求方法(大杂烩)

Any可以接收 GET/POST/PUT/DELETE 任意一种请求方式

Go 复制代码
// 无论什么请求方式访问 /test,都会命中该函数
r.Any("/test", func(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{"msg":"Any接收所有请求"})
})

3. r.NoRoute () ------ 自定义 404 页面

当访问的路由没有匹配到任何处理函数时,默认返回 404。 NoRoute用来统一捕获 404 请求,自定义返回内容。

Go 复制代码
// 需要提前加载html模板文件
r.NoRoute(func(c *gin.Context) {
	c.HTML(http.StatusNotFound, "views/404.html", nil)
})

三、路由组 r.Group ()

3.1 什么是路由组

路由组等价于给一批接口添加统一 URL 前缀,适合归类同一模块下的多个接口。 类比于 Flask 中的蓝图,用来实现接口模块化管理。

例如视频模块下一堆接口: /video/index/video/xx/video/oo 公共前缀:/video

3.2 代码示例(推荐大括号包裹写法,可读性更高)

Go 复制代码
package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// 创建路由组,统一前缀 /video
	videoGroup := r.Group("/video")
	{
		videoGroup.GET("/index", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/index"})
		})

		videoGroup.GET("/xx", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/xx"})
		})

		videoGroup.GET("/oo", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/oo"})
		})
	}

	r.Run(":8080")
}

访问地址:

3.3 路由组的优势

  1. 接口分类清晰,视频、用户、文章模块路由分开管理
  2. 可以给整个路由组统一添加中间件(权限校验、日志打印)
  3. 后期修改公共前缀时,只需要修改Group("/video")一处代码

四、普通路由 VS 路由组对比总结

表格

类型 适用场景 示例地址
普通路由 少量、零散无统一前缀的接口 /login /register
路由组 Group 同一业务模块下大量平级接口 /video/index /video/list

五、拓展:嵌套路由组(进阶复习)

路由组还可以继续嵌套,实现多级前缀:

Go 复制代码
videoGroup := r.Group("/video")
{
	// 二级路由 /video/admin
	admin := videoGroup.Group("/admin")
	{
		admin.GET("/list", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/admin/list"})
		})
	}
}
相关推荐
陈老老老板16 分钟前
2026 Web Scraping 教程:用 Codex + Bright Data 构建 Agent 原生数据采集流程
后端
Southern Wind18 分钟前
从一段文字到一部动态漫:如何打造全流程分镜创作工作台 StoryCanvas AI
前端·javascript·vue.js·人工智能
烂蜻蜓24 分钟前
Flask入门教程(七):请求与响应——Web应用的核心数据流
前端·python·flask
爱勇宝31 分钟前
从前端到全栈,我最后学会的是:先做产品
前端·后端
console.log('npc')34 分钟前
Grill-Me 技能使用教程
前端·大模型·产品·skill·需求
真空回流焊炉1 小时前
数字功率芯片真空共晶设备实操教程与要点解析
前端·人工智能
mayaairi1 小时前
JS DOM属性操作完全指南:内容、样式与自定义属性
开发语言·前端·javascript
avi91111 小时前
Threejs新版本后glb导出提示.x问题GLTFExporter,替代3dmax
开发语言·前端·javascript·threejs·glb·gltfexporter