百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Golang Web框架Gin解析(三)(golang最好的web框架)

ccwgpt 2024-09-18 12:19 24 浏览 0 评论

首先,在这里祝大家中秋快乐,阖家幸福。其次,深表歉意由于最近公司事情比较多,没有来的及写后面的学习内容。

借此节日为大家奉上第三篇学习笔记,在前面我们看了Gin的最核心的部分是自定义一个http.Handle结构体,并且我们详细的看了Gin是怎么定义结构体的属性的。并且我们在上一篇中看到Gin的自定义属性中第一个属性就是组合了RouteGroup.那么今天我们就来看看这个RouteGroup到底在Gin中充当一个什么角色?

首先我们打开Gin项目中的routergroup.go的文件,首先展现在我们的面前的是两个interface{}接口定义,分别是:

1.IRouters定义了所有路由handle的方法接口

type IRoutes interface {
 Use(...HandlerFunc) IRoutes
 Handle(string, string, ...HandlerFunc) IRoutes
 Any(string, ...HandlerFunc) IRoutes
 GET(string, ...HandlerFunc) IRoutes
 POST(string, ...HandlerFunc) IRoutes
 DELETE(string, ...HandlerFunc) IRoutes
 PATCH(string, ...HandlerFunc) IRoutes
 PUT(string, ...HandlerFunc) IRoutes
 OPTIONS(string, ...HandlerFunc) IRoutes
 HEAD(string, ...HandlerFunc) IRoutes
 StaticFile(string, string) IRoutes
 Static(string, string) IRoutes
 StaticFS(string, http.FileSystem) IRoutes
}

2.IRouter定义了所有单路由或组路由的handle实现

type IRouter interface {
 IRoutes
 Group(string, ...HandlerFunc) *RouterGroup
}

以上的定义主要是我们定义了我们实际定义路由时可以使用的方法,并且我们可以通过这些定义快速的实现我们想要的restful的接口。

那么接下来我们来具体的看一下针对这两个interface{} Gin是怎么实现的。这里就有了我们的RouterGroup

type RouterGroup struct {
 Handlers HandlersChain
 basePath string
 engine *Engine
 root bool
}

其中

1.handles是一个Gin自定一个函数数组,这个函数就是我们在实际使用中写func a(c *gin.Context) 这就是Gin自定义HandleFunc

2.basePath 用来存储每一个分组的path如app.Group("/user")此时我们得到的RouterGroup就为/user

3.engine是实际的Gin框架对象

4.root 是否为根节点,前面我们说过gin对象第一个属性就组合了RouterGroup那么在Gin初始化是我们得到的Gin,app对象的root属性就为true

好,那么接下来我们看一看Gin的方法,实现主要含义。

func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
 group.Handlers = append(group.Handlers, middleware...)
 return group.returnObj()
}

先看一下Use方法,Use方法使用过Gin的同学一定不陌生,我们做用户验证,做请求拦截等等,经常会使用到Use这是Gin的中间件方法,那么我们来看一下Use主要干了件什么事情,

我们看到Use总共就两行代码,group.Handlers=append(group.Handlers,middleware...)和一个return ,上面我们已经说过Handlers是Gin的一个自定义函数,那么我们就明白了其实Gin的中间件也就是一个Gin的自定义函数的实现。(这里我们提前透露一下,Gin在执行Handlers时,是按照数组下标以此向下执行)因此我们就可以理解中间件的方式了。

好,那么我们在来看一个GET方法的实现,在实际开发中我们经常使用

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
 return group.handle("GET", relativePath, handlers)
}
func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
 absolutePath := group.calculateAbsolutePath(relativePath)
 handlers = group.combineHandlers(handlers)
 group.engine.addRoute(httpMethod, absolutePath, handlers)
 return group.returnObj()
}

我们看到GET方法(其实RouterGroup的其它方法都是调用了这个handle方法,除静态文件相关。)是调用了一个RouterGroup的私有方法,handle那么这个方法主要是用来做什么事情呢,这中间有个addRoute容我们下回细说,今天先不展开了。主要说下原理其实addRoute将会把我们的请求地址按照层级放入到一个树中,然后当请求过来时我们会根据请求的地址访问指定的一组handlefunc。

总结

今天主要和大家分享了RouterGroup的一些方法和对象的定义并且在,在这中间我们还留下了几个细节没有深入学习,接下我将会深入的学习中间的实现并分享给大家。

1.关于Gin每次请求都是下标式请求,如何实现的?

2.关于路由注册时Gin是如何组装这些请求的并且最终实现下标式请求?

希望有深入学习过的朋友先给分享点思路。

相关推荐

5 分钟搭建 Node.js 微服务原型(node 微服务架构)

微服务已成为在Node.js中构建可扩展且强大的云应用的主流方法。同时也存在一些门槛,其中一些难点需要你在以下方面做出决策:组织项目结构。将自定义服务连接到第三方服务(数据库,消息代理等)处理微服...

当前的前端,真的不配叫程序员吗?

今天看到一个比较令人震惊的帖子,说前端不配叫程序员,令我很吃鲸,是谁我就不说了,帖子出处是一个大龄程序员组里面的,想想也不觉得奇怪了,毕竟对于年龄比较大的程序员来说,前端起步比较晚,最开始就是一个切图...

聊聊asp.net中Web Api的使用(asp.net core web api教程)

扯淡随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式。这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大哥...

NodeJS中,listen Access:permission denied解决办法

错误描述:Win10系统,NodeJS程序。使用express框架开发的http服务器,启动时出现错误提示“listenAccess:permissiondenied"。错误原因:这是由于...

Hono — 下一代高性能web框架(天融信下一代vnp)

最近公司可能要有变革,要统计我们的技能。真的是很无语,但是有没有办法。哎,问豆包吧提起Hono大家可能很陌生,这是什么?但是我提到Expressjs、nodejs想必前端小伙伴很熟悉啊。那么Hon...

生活例子说明线程,简单明了(列举一个日常生活中的例子以程序的形式表示)

1.程序设计的目标在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能...

Node实战006:自定义模块的创建和使用详解

Node的应用是由模块组成的,每个文件的定义都是一个模块(module变量代表当前模块)并有自己的作用域。Node遵循commonjs的模块规范,用来隔离每个模块的作用域,使每一个模块在自身的命名空间...

Node.js基本内容和知识点(node.js的概念)

简单的说Node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目会完全使用node.js作为后台支撑,大项目中,运行不够稳定,不会轻易使用...

干货 | 如何利用Node.js 构建分布式集群

引言在软件定义的世界里,企业通过Web应用和移动应用程序来提供大部分的服务,Node.js迅速成为时下最为流行的一个平台之一,就和它可以搭建响应速度快、易于扩展的web应用和移动应用有很大关系,并凭...

nodejs mongodb 实现简易留言板(node.js留言板)

一个朋友问了一下mongodb的一些操作问题我就做了下面这个简单的留言板给他做一个实例希望能帮助到他express的框架就不说了express的问题请移步nodejs之expressht...

nodejs mqtt 智能售货机系统物联网控制系统源码分享

智能售货机系统(Moleintelligentvendingmachinesystem)是一套物联网控制系统性的解决方案。主要涉及到的语言和库有c,c++,js,nodejs,vue.js,...

为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

说nodejs只是靠营销的是否太天真了些?当初nodejs出来的时候各种BUG,我简单的测试其大文件传输都会出现各种问题。而同時期的其他阵营早就甩其几条街了。但是为什么却能一直不断发展壮大?...

2020年14个最有用的NodeJS库(node用什么数据库)

Express快速,简单,极简的节点Web框架对…有好处·易于处理多种类型的请求,例如GET,PUT,POST和DELETE请求·快速构建单页,多页和混合Web应用程序每周下载1100万Lice...

连载:2016年最好的JS框架和库(下)

继续上一期的介绍:Agility.jsAgility.js是专为JS服务的MVC库,你可以免费编写可再用和可维护的浏览器代码,Agility支持Js,样式(CSS)、内容(HTML)和行为(JS)。C...

awesome-nodejs 终极资源库:60K+星标的开发者宝藏

Node.js终极资源库:60K+星标的开发者宝藏引言在GitHub上,有一个备受瞩目的Node.js资源仓库,以其惊人的60.6k星标量和6kfork量,成为了Node.js开发者的必备参考。这个...

取消回复欢迎 发表评论: