「Go框架」gin中Context中的Get、Query、Param函数都是从哪里获取数据的?
在使用gin框架处理一次请求的过程中,可以通过Context结构体提供的小程序 源码管理方法获取或设置一个指定key的值。在Context中有多个通过key获取值的函数:GetString(key string) (s string)、Param(key string) string、Query(key string) (value string)、PostForm(key string) (value string)、GetHeader(key string)、Cookie(name string)等。
这些函数底层的数据源如下:
Context.Get函数的数据源是Context.Keys字段。Keys是一个map[string]any类型的map,值可以是任意类型。数据的源码用什么开发生命周期是本次请求,作用域范围仅限于本次请求。Context.Keys字段的初始化采用lazy模式,在使用Context.Set函数时才进行初始化。
Context.Param函数是从正则路径中获取对应的匹配数据值。正则路径的参数被解析到Context.Params字段中。
Context.Query函数获取的是url中的查询参数的值。这些值解析到Context中的queryCache字段中,来源于Context.Request.URL.RawQuery。
Context.PostForm函数获取的是form表单的urlencode编码的集合中数据。form表单的数据缓存在Context的formCache中。获取时直接从formCache中获取。
总结,gin框架中获取指定key值的函数数据来源包括:Context.Keys字段、正则路径中的Params字段、url查询中的表白开源源码queryCache字段以及form表单中的formCache字段。
Go 语言之在 gin 框架中使用 zap 日志库
在 Go 语言中,gin 框架是一个流行的 Web 框架,它默认使用自带的日志库 gin.Default() 的源码 Logger() 和 Recovery() 进行日志记录和错误恢复。
然而,对于需要更强大日志功能的开发者来说,使用 zap 日志库是一个不错的选择。
下面是具体的实操步骤:
1. 运行并访问:localhost:/hello
2. 生成的日志文件为:test.log
3. 如需参考更多内容,请访问:github.com/gin-contrib/...
go-gin框架路由自动注册(iris-mvc方式)附源码
通过分析,gin与iris在路由注册机制上有着明显的差异。gin采用逐条注册方式,而iris-mvc通过将子路由路径与controller方法名关联,实现更为简便的注册。
为了使gin具备iris-mvc的注册便捷性,我们可以采用包装技术,使gin的源码时代毕业季路由能以子方法名称的方式自动注册。这一方法要求方法名称符合特定格式,如GetTest,代表对test子路径注册get请求的路由。
在自动注册实现过程中,涉及到的文件包括控制器文件(/controller/hello_controller.go)、路由文件(/route/autoRoute.go)和路由管理文件(/route/route.go),最终集成到主程序(/main.go)中。
为了验证自动注册与原生注册方式的性能差异,我们进行了简单性能测试。使用ab工具,分别在阿里云环境下进行1W并发、W请求的测试,比较两种方式的响应时间。
测试结果显示,在性能方面,源码后门干嘛的自动注册方式与原生注册方式表现相当,甚至在特定情况下(如.百分位响应时间),自动注册方式更具优势。因此,在处理1W并发请求场景时,自动注册方式是一个值得考虑的优化方案。
附上源码,供参考与实践。此源码实现了上述功能,帮助开发者轻松地将gin框架的路由注册流程优化为更符合iris-mvc风格的自动化注册流程。
Golang Gin 实战(十三)| 中间件详解看这一篇就够了
通过这篇文章,我们深入理解了Gin中间件的精髓。Gin默认提供了两个中间件:Logger 和 Recovery,它们帮助我们进行日志记录和panic处理。
一个Gin中间件本质上是一个HandlerFunc,我们可以通过自定义HandlerFunc来实现自己的中间件,如统计请求执行时间。
对于HTTP Basic Authorization,Gin提供了gin.BasicAuth中间件。我们可以通过它为特定URL或分组路由设置认证。例如,我们添加了一个用户名为admin、密码为的账户,用于认证,只有正确输入用户名和密码才能访问特定资源。
责任链模式在Gin中间件中得到了应用,多个对象按照顺序依次处理请求,直至完成或传递给下一个对象。通过这种方式,我们可以在请求处理流程中灵活添加或移除处理逻辑。
通过自定义中间件,我们可以轻松拦截请求,实现日志记录、授权校验、过滤等操作,大大增强了Gin框架的灵活性和可扩展性。
为了进一步深入学习Gin框架,这里推荐几篇精彩文章:
使用和源码分析原理实现
HTML模板渲染
XML渲染
JSONP跨域和劫持
JSON渲染输出
如何评价golang的gin框架?
如何评价 Golang 的 Gin 框架?
Gin 是 Golang 世界里最流行的 web 框架,它基于 Golang HTTP 标准库 net//手败gin-gonic/gin
一个简单的例子:
packagemain
import"github.com/gin-gonic/gin"
funcmain(){
//Default返回一个默认的路由引擎
r:=gin.Default()
r.GET("/ping",func(c*gin.Context){
//输出json结果给调用方
c.JSON(,gin.H{
"message":"pong",
})
})
r.Run()//listenandserveon0.0.0.0:
}
编译运行程序,打开浏览器,访问页面显示:
{ "message":"pong"}
gin的功能不只是简单输出Json数据。它是一个轻量级的WEB框架,支持RestFull风格API,支持GET,POST,PUT,PATCH,DELETE,OPTIONS等/gin-gonic/gin"
)
funcmain(){
router:=gin.Default()
//静态资源加载,本例为css,js以及资源
router.StaticFS("/public",/ffhelicopter/tmm/website/static"))
router.StaticFile("/favicon.ico","./resources/favicon.ico")
//Listenandserveon0.0.0.0:
router.Run(":")
}
首先需要是生成一个Engine,这是gin的核心,默认带有Logger和Recovery两个中间件。
router:=gin.Default()
StaticFile是加载单个文件,而StaticFS是加载一个完整的目录资源:
func(group*RouterGroup)StaticFile(relativePath,filepathstring)IRoutes
func(group*RouterGroup)StaticFS(relativePathstring,fs/gin-gonic/gin
如果安装失败,直接去Githubclone下来,放置到对应的目录即可。
(2)代码中使用:
下面是一个使用Gin的简单例子:
packagemain
import(
"github.com/gin-gonic/gin"
)
funcmain(){
router:=gin.Default()
router.GET("/ping",func(c*gin.Context){
c.JSON(,gin.H{
"message":"pong",
})
})
router.Run(":")//listenandserveon0.0.0.0:
}
简单几行代码,就能实现一个web服务。使用gin的Default方法创建一个路由handler。然后通过HTTP方法绑定路由规则和路由函数。不同于net/e"}。
注:Gin还包含更多的返回方法如c.String,c.HTML,c.XML等,请自行了解。可以方便的返回HTML数据
我们在之前的组v1路由下新定义一个路由:
下面我们访问
可以看到,通过c.Param(“key”)方法,Gin成功捕获了url请求路径中的参数。同理,gin也可以捕获常规参数,如下代码所示:
在浏览器输入以下代码:
通过c.Query(“key”)可以成功接收到url参数,c.DefaultQuery在参数不存在的情况下,会由其默认值代替。
我们还可以为Gin定义一些默认路由:
这时候,我们访问一个不存在的页面:
返回如下所示:
下面我们测试在Gin里面使用Post
在测试端输入:
附带发送的数据,测试即可。记住需要使用POST方法.
继续修改,将PostHandler的函数修改如下
测试工具输入:
发送的内容输入:
返回结果如下:
备注:此处需要指定Content-Type为application/x-www-form-urlencoded,否则识别不出来。
一定要选择对应的PUT或者DELETE方法。
Gin框架快速的创建路由
能够方便的创建分组
支持url正则表达式
支持参数查找(c.Paramc.Queryc.PostForm)
请求方法精准匹配
支持处理
快速的返回给客户端数据,常用的c.Stringc.JSONc.Data
2024-12-24 08:27
2024-12-24 08:16
2024-12-24 08:01
2024-12-24 06:54
2024-12-24 06:33