在 上一篇 Golang Gin 实战(三)| 路由参数 文章中,主要介绍了路由通配符、路由参数,让我们有了一种可以从URL路径中获取参数的方式,同时又不是重复的注册相似的路由。

这一篇,主要介绍查询参数,以及获取查询参数的示例以及底层原理。

查询参数(query parames)

Querystring parameters ,翻译成中文我只能叫查询参数了,不过觉得挺别捏的。其实这种参数我们并不陌生,比如:

https://www.flysnow.org/search?q=golang&sitesearch=https%3A%2F%2Fwww.flysnow.org
?k=v&k1=v1&k2=v2
?q=golang&sitesearch=https%3A%2F%2Fwww.flysnow.org

这个示例中有两个查询参数键值对:

q=golang
sitesearch=https%3A%2F%2Fwww.flysnow.org
qgolangsitesearchhttps%3A%2F%2Fwww.flysnow.org&&

Gin获取查询参数

Gin
func main() {
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.String(200, c.Query("wechat"))
    })
    r.Run(":8080")
}
http://localhost:8080/?wechat=flysnow_orgflysnow_orgc.Query("wechat")wechatflysnow_org
Querykeykey""idDefaultQuery
c.DefaultQuery("wechat", "flysnow_org")

c.DefaultQuery("id", "0")

比如这样,尤其是第二个例子,默认为0,让我们字符串转数字很方便。

func (c *Context) Query(key string) string {
    value, _ := c.GetQuery(key)
    return value
}


func (c *Context) DefaultQuery(key, defaultValue string) string {
    if value, ok := c.GetQuery(key); ok {
        return value
    }
    return defaultValue
}
GetQueryDefaultQuerykeydefaultValue

原理解析

GetQuerygin.ContextQuerykey
value, ok := c.GetQuery("wechat")
GetQueryQuery
GetQueryc.Request.URL.Query().Get(key)url.URL.Query()
本质上是调用的GetQueryArray,取的数组中第一个值
func (c *Context) GetQuery(key string) (string, bool) {
    if values, ok := c.GetQueryArray(key); ok {
        return values[0], ok
    }
    return "", false
}


func (c *Context) GetQueryArray(key string) ([]string, bool) {
    c.getQueryCache() //缓存所有的键值对
    if values, ok := c.queryCache[key]; ok && len(values) > 0 {
        return values, true
    }
    return []string{}, false
}

func (c *Context) getQueryCache() {
    if c.queryCache == nil {
        c.queryCache = c.Request.URL.Query()
    }
}
GetQueryArraykey[]string
GinqueryCacheurl.Valuesmap[string][]string
type Values map[string][]string
c.Request.URL.Query()?k=v&k1=v1&k2=v2map[string][]stringGinGin

小结

GetQueryArraykey

可能大家没有留意,我的文章,我都会稍微加入一些原理、源代码的分析,这个主要就是为了让大家更了解其中的原理,可以更好的使用它们,更为了大家能够通过这个分析,提升自己的技术能力,比如这里用到的缓存机制。

感谢新老朋友的转发、阅读和点赞支持,给大家抽个现金红包(点击参与),在看到50,下次抽奖金额翻倍!

flysnow_org
往期 精彩回顾Golang Gin 实战(三)| 路由参数Golang Gin 实战(二)| 简便的Restful API 实现
Golang Gin 实战(一)| 快速安装入门

ea40e69089fc799505909a14a12e3511.png

扫码关注