新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/26 2:46: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
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

5分钟集成 BlockSuite 预设组件:PageEditor 与 EdgelessEditor 快速指南 2026/9/26 2:46:50

5分钟集成 BlockSuite 预设组件:PageEditor 与 EdgelessEditor 快速指南

5分钟集成 BlockSuite 预设组件:PageEditor 与 EdgelessEditor 快速指南 【免费下载链接】blocksuite 🧩 Content editing tech stack for the web - BlockSuite is a toolkit for building editors and collaborative applications. 项目地址: https:…

阅读更多 →
Science Robotics | 让柔性内窥镜“自己找路”:磁驱动机器人如何突破大型腔体微创手术的极限 2026/9/26 2:46:44

Science Robotics | 让柔性内窥镜“自己找路”:磁驱动机器人如何突破大型腔体微创手术的极限

导语:在子宫、胃、膀胱等大型开放腔体中,微创手术面临一个根本性矛盾——器械越柔性越安全,但越柔性越难控制。没有解剖管壁的约束,柔性器械就像一根“软面条”在空腔中漂移,医生只能靠记忆在有限的视野中摸索。更棘手…

阅读更多 →
Substrate区块链开发框架:模块化架构与FRAME实战指南 2026/9/26 2:46:44

Substrate区块链开发框架:模块化架构与FRAME实战指南

1. 从零认识 Substrate:它到底是什么,能解决什么问题第一次听到 Substrate 这个词,很多人会以为是某个前端框架或者构建工具,其实它是一套用于构建区块链底层网络的开发框架。你可以把它理解成“区块链世界的操作系统内核”——它…

阅读更多 →
Substrate区块链框架深度解析:架构、存储、Weight与实战踩坑 2026/9/26 2:46:44

Substrate区块链框架深度解析:架构、存储、Weight与实战踩坑

1. 从一条报错日志说起:substrate 到底是个什么东西第一次在生产环境里看到substrate这个词,是在一条 panic 日志里。当时我们的链上节点在同步到某个高度后突然崩了,日志最后一行写着panicked at Storage root mismatch, frame/support/src/…

阅读更多 →
国产模拟芯片上车:车规认证、技术门槛与选型实践 2026/9/26 2:46:37

国产模拟芯片上车:车规认证、技术门槛与选型实践

1. 国产模拟厂商的“上车”潮到底在说什么最近跟几个做车载电子的老朋友聊天,话题绕来绕去总离不开一个词——“上车”。不是咱们平时说的坐车,而是国产模拟芯片厂商集体往汽车电子这个赛道里挤。做电源管理的、做信号链的、做隔离器件的,甚至…

阅读更多 →
Agent-VibeCoding 实战:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置 2026/9/26 2:46:37

Agent-VibeCoding 实战:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉