首页/新闻资讯/正文详情

跟大佬学Go:Day Four 路由分组(RouterGroup)

发布时间:2026/9/24 23:41:51 来源:云帆数科 栏目:资讯中心
跟大佬学Go:Day Four 路由分组(RouterGroup)
今日学习网址https://geektutu.com/post/gee-day4.html分组的意义解决的问题是当涉及到多个接口的时候一个一个注册完整的路径太过繁杂不仅不方便管理而且代码会十分冗余。又因为我们对某一组路由的处理方式是类似的例如以/post开头的路由匿名可访问。以/admin开头的路由需要鉴权。以/api开头的路由是 RESTful 接口可以对接第三方平台需要三方平台鉴权。所以我们可以根据通过相同的前缀来区分并进行分组控制并且支持分组的嵌套例如/post是一个分组/post/a和/post/b可以是该分组下的子分组。作用在/post分组上的中间件(middleware)也都会作用在子分组子分组还可以应用自己特有的中间件。可以共享中间件的就可以干出很多事情了比如在根目录添加记录日志的中间件那么所有路由都可以记录日志。分组嵌套Group对象需要具备哪些属性呢前缀prefix要进行分组嵌套需要知道当前路由的父亲pattern是谁中间件middlewares存储应用在该分组上的中间件访问路由Router的能力之前是通过(*Engine).addRouter来映射所有路由规则以及handler的所以需要给予访问路由的能力。大佬想到了一个简单的方法保存一个指针指向Engine因为所有资源都由Engine统一协调就可以通过Engine间接的访问所有接口Group的定义如下typeRouterGroupstruct{prefixstringmiddlewares[]HandlerFunc// support middlewareparent*RouterGroup// support nestingengine*Engine// all groups share a Engine instance}此时大佬再次展示操作进一步抽象“将Engine作为最顶层的分组也就是说Engine拥有RouterGroup所有的能力。”// Engine implement the interface of ServerHTTPtypeEnginestruct{*RouterGroup router*router groups[]*RouterGroup// store all groups}将和路由有关的函数都将RouterGroup去处理实现// Group is defined to create a new RouterGroup// remember all groups share the same Engine instancefunc(group*RouterGroup)Group(prefixstring)*RouterGroup{engine:group.engine newGroup:RouterGroup{prefix:group.prefixprefix,parent:group,engine:engine,}engine.groupsappend(engine.groups,newGroup)returnnewGroup}func(group*RouterGroup)addRouter(methodstring,compstring,handler HandlerFunc){pattern:group.prefixcomp log.Print(Route %4s - %s,method,pattern)group.engine.router.addRoute(method,pattern,handler)}// GET defines the method to add GET requestfunc(group*RouterGroup)GET(patternstring,handler HandlerFunc){group.addRouter(GET,pattern,handler)}// POST defines the method to add POST requestfunc(group*RouterGroup)POST(patternstring,handler HandlerFunc){group.addRouter(POST,pattern,handler)}其中比较神奇的是addRouter函数中调用group.engine.router.addRoute来实现路由的映射这样既可以添加路由也可以通过分组添加路由main.gofuncmain(){r:gee.New()r.GET(/index,func(c*gee.Context){c.HTML(http.StatusOK,h1Index Page/h1)})v1:r.Group(/v1){v1.GET(/,func(c*gee.Context){c.HTML(http.StatusOK,h1Hello Gee/h1)})v1.GET(/hello,func(c*gee.Context){c.String(http.StatusOK,hello %s, youre at %s\n,c.Query(name),c.Path)})}v2:r.Group(/v2){v2.GET(/hello/:name,func(c*gee.Context){c.String(http.StatusOK,hello %s, youre at %s\n,c.Query(name),c.Path)})v2.POST(/login,func(c*gee.Context){c.JSON(http.StatusOK,gee.H{usename:c.PostForm(usename),password:c.PostForm(password),})})}r.Run(:9999)}执行顺序程序启动时文件调用顺序main.go → gee.go → router.go → trie.go执行过程main.go执行main()调用gee.New()创建框架实例。gee.go创建Engine、初始化根路由分组并调用newRouter()。router.go初始化路由管理器创建roots和handlers两个 map。main.go调用GET()、POST()或Group()注册路由。gee.go拼接路由分组前缀将完整路由交给router.addRoute()。router.go解析路由路径并调用trie.go中的insert()。trie.go将路由规则插入 Trie 前缀树。router.go将路由对应的处理函数保存到handlers。main.go调用r.Run(:9999)启动 HTTP 服务器等待客户端请求。处理 HTTP 请求时文件调用顺序gee.go → context.go → router.go → trie.go → router.go → 业务 Handler → context.go执行过程gee.goEngine.ServeHTTP()接收 HTTP 请求。context.go调用newContext()创建当前请求的Context保存请求路径、请求方法等信息。router.go调用router.handle()通过getRoute()查找匹配的路由。trie.go调用search()利用 Trie 前缀树匹配请求路径。router.go获取匹配结果提取动态路由参数并找到对应的 Handler。业务 Handler执行main.go中注册的业务处理函数。context.go通过c.String()、c.JSON()等方法生成 HTTP 响应。客户端接收服务器返回的响应。测试curl http://localhost:9999/v1/hello?nameyuexi curl http://localhost:9999/v2/hello/yuexi结果hello yuexi, youre at /v1/hello hello , youre at /v2/hello/yuexi

相关推荐

Jev模型实测:不生成文字的System One决策模型如何降低AI延迟
Jev模型实测:不生成文字的System One决策模型如何降低AI延迟

我第一次认真去了解 Jev,是因为一个特别具体的工作场景:我要让智能体自动处理一批线上操作,每一步结果都正确,但整个过程就是快不起来。模型输出的文字又长又漂亮,真正落到执行层,我却只需要一个动作编号。… · 2026/9/24 23:41:44

GPT-6提示词瘦身实战:从长提示词到Skills的工程化转型
GPT-6提示词瘦身实战:从长提示词到Skills的工程化转型

1. 先搞清楚:官方为什么让我们给提示词“做减法”1.1 GPT-6 的推理结构变了,长提示词反而成了负担最近关于 GPT-6 的讨论里,OpenAI 官方反复强调一个意思:把上下文留给真正需要模型判断的地方。这句话听起来像客套话,但… · 2026/9/24 23:41:44

提示词瘦身实战:从千字prompt到短提示+Skill,效率提升40%
提示词瘦身实战:从千字prompt到短提示+Skill,效率提升40%

最近 OpenAI 官方在文档和开发者活动里反复强调一个观点:提示词要“做减法”。这个风向变化挺有意思,以前大家比的是谁的 prompt 写得长、写得细,现在官方却直接告诉你,越短越好。尤其是 GPT-6 这一代模型和 Skills(技… · 2026/9/24 23:41:44

深度学习新闻分类推荐系统:从TextCNN到个性化推荐
深度学习新闻分类推荐系统:从TextCNN到个性化推荐

简介:这份基于深度学习的新闻分类推荐系统Python实现源码,是专为课程设计与期末大作业准备的高分项目,下载后无需修改即可运行,适用于需要快速交付完整课题的高校学生。系统涵盖新闻数据预处理、文本分类模型训练、推荐逻辑展示等… · 2026/9/24 23:59:53

汽车电子底层软件开发:AUTOSAR与CAN总线实战解析
汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

1. 这门“汽车电子底层软件开发就业课”到底在教什么?——不是写个LED闪烁就能上岗的很多人看到“汽车电子底层软件开发就业课”这个标题,第一反应是:不就是嵌入式C语言单片机CAN通信?刷几道LeetCode、调通一个STM32 CAN收发例程&… · 2026/9/24 23:59:53

Vim基础操作全攻略:保存退出、模式切换与高频命令实战
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保… · 2026/9/24 23:59:53

Python+CNN车牌识别实战:从数据预处理到模型训练与部署
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据… · 2026/9/24 23:59:53

AI元人文:从工具使用到思维重构的深度探索
AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决… · 2026/9/24 23:59:53

《AI Agent 场景应用 - MobileOpenClaw》第5-9节:会话上下文细化处理实战指南
《AI Agent 场景应用 - MobileOpenClaw》第5-9节:会话上下文细化处理实战指南

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/24 23:59:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码