gin框架Context如何获取Get Query Param函数数据

 更新时间:2023年03月31日 16:22:17   作者:渔夫子 Go学堂  
这篇文章主要为大家介绍了gin框架Context Get Query Param函数获取数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

gin框架

在使用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 []Param

type 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字段。具体可以参考下图:

以上就是gin框架Context如何获取Get Query Param函数数据的详细内容,更多关于gin框架Context数据获取的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言函数的延迟调用(Deferred Code)详解

    Go语言函数的延迟调用(Deferred Code)详解

    本文将介绍Go语言函数和方法中的延迟调用,正如名称一样,这部分定义不会立即执行,一般会在函数返回前再被调用,我们通过一些示例来了解一下延迟调用的使用场景
    2022-07-07
  • Golang Gin局部和全局中间件使用详解

    Golang Gin局部和全局中间件使用详解

    中间件是放在客户端和服务端的中间,当你的客户端对某个接口发起一个请求,但是在到达接口2之前,这里是有一层中间件的处理。本文详细介绍了Golang Gin局部、全局中间件使用方法,感兴趣的同学可以阅读本文
    2023-04-04
  • 浅谈Go Channel 高级实践

    浅谈Go Channel 高级实践

    这篇文章主要介绍了浅谈Go Channel 高级实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 如何在Go中将[]byte转换为io.Reader

    如何在Go中将[]byte转换为io.Reader

    本文主要介绍了如何在Go中将[]byte转换为io.Reader,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • golang http使用踩过的坑与填坑指南

    golang http使用踩过的坑与填坑指南

    这篇文章主要介绍了golang http使用踩过的坑与填坑指南,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    详解 Go 语言中 Map 类型和 Slice 类型的传递

    这篇文章主要介绍了详解 Go 语言中 Map 类型和 Slice 类型的传递的相关资料,需要的朋友可以参考下
    2017-09-09
  • Golang等多种语言转数组成字符串举例详解

    Golang等多种语言转数组成字符串举例详解

    今天写代码遇到数组转换成字符串操作,下面这篇文章主要给大家介绍了关于Golang等多种语言转数组成字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • golang操作连接数据库实现mysql事务示例

    golang操作连接数据库实现mysql事务示例

    这篇文章主要为大家介绍了golang操作连接数据库实现mysql事务示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • go sync.Once实现高效单例模式详解

    go sync.Once实现高效单例模式详解

    这篇文章主要为大家介绍了go sync.Once实现高效单例模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • golang中如何保证精度的方法

    golang中如何保证精度的方法

    本文主要介绍了golang中如何保证精度的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论