大家好,我是渔夫子。

在应用gin框架解决一次申请的过程中,能够通过Context构造体提供的办法获取或设置一个指定key的值。在Context中有多个通过key获取值的函数:GetString(key string) (s string)Param(key string) stringQuery(key string) (value string)PostForm(key string) (value string)GetHeader(key string)Cookie(name string)等。

那么,这些函数到底是从哪里获取数据的呢?本文就带你一起来探索这些函数底层的数据源。

Context中Get函数的数据源

Context.Get函数是从Context.Keys字段中获取的数据。咱们看下Context的Keys字段的定义(为不便文章阐明,咱们省略了Context中的其余无关字段):

type Context struct {    // Keys is a key/value pair exclusively for the context of each request.    Keys map[string]any}

能够看到,Keys是一个map[string]any类型的map。anygininterface{}的别名。通过该定义可知,在Keys字段中键必须是string类型,值能够是任意类型。

这个Keys中的值又来源于哪里呢?是在gin服务在解决申请时通过Context.Set函数设置的。Keys里的数据的生命周期是本次申请,作用域范畴也仅限于本次申请。申请完结了,Keys里的值也就完结了。

同时,Context.Keys字段的初始化也采纳了lazy模式。即在应用Context.Set函数时才进行初始化的。

对于Get函数来说,还有一些GetXXX的辅助函数,比方:MustGet、GetString、GetBool、GetInt、GetInt64等等,也都是从Keys中获取数据。

Context中Param函数的

Context.Param(key string)函数是从正则门路中获取对应的匹配数据值。在gin中,正则门路的参数是被解析到Context.Params字段中的。其字段定义如下:

type Context struct {    Params   Params}type Params []Paramtype Param struct {    Key   string    Value string}

例如,咱们定义了正则门路 "/user/:id",那么通过c.Param("id")函数就能获取到本次路由中的id参数值。

router.GET("/user/:id", func(c *gin.Context) {    // a GET request to /user/john    id := c.Param("id") // id == "john"})

Context中Query函数的数据源

Context.Query函数是获取的url中的查问参数的值。在gin中,将查问参数的值会解析到Context中的queryCache字段中,而queryCache的数据则来源于Context.Request.URL.RawQuery中。如下:

type Context struct {    // queryCache caches the query result from c.Request.URL.Query().    queryCache url.Values}

比方,咱们申请的url是 GET /path?id=1234&name=Manu&value=,那么就能够通过Query查问到id、name和value对应的值:

c.Query("id") == "1234"c.Query("name") == "Manu"c.Query("value") == ""c.Query("wtf") == ""

Context中的PostForm函数的数据源

Context.PostForm(key string) 函数是从form表单的urlencode编码的汇合中获取数据。这里是form表单中以urlencoded模式编码的key/value值。如果是上传的文件,则不能通过该函数获取。

在gin框架中,会把form表单的数据缓存到Context的formCache中。获取时,会间接从formCache中获取。如下:

type  Context struct {    formCache url.Values}

通过formCache字段的类型为url.Values也能够晓得,该字段存储的只有form表单中的urlencode编码的key/value值。
比方,有如下form表单,那么formCache中的值就是username和password。而action值中的utm_source=login以及file类型的参数是不在formCache中的。

<form action="http://localhost:9090/login?utm_source=login" method="POST" enctype="multipart/form-data">    <input type="text" name="username" value="yufuzi" />    <input type="text" name="password" />    <input type="file" name="f" />    <input type="submit" value="submit" /></form>

总结

本文总结了gin框架中应用Context构造体中获取指定key的值的各种函数的数据起源。通过Context中Keys字段、动静路由中门路中的参数的Params字段、url查问中查问参数的queryCache字段以及form表单中urlencode参数的formCache字段。具体能够参考下图:

特地举荐:一个专一go我的项目实战、我的项目中踩坑教训及避坑指南、各种好玩的go工具的公众号,「Go学堂」,专一实用性,十分值得大家关注。点击下方公众号卡片,间接关注。关注送《100个go常见的谬误》pdf文档。

原文链接:https://mp.weixin.qq.com/s/amfGIdxA166cqKzpGd_Dpw