Golang Gin 實戰(五)


Golang Gin 實戰(五)| 接收數組和 Map


在 上一篇 文章中,因為文章篇幅問題,QueryArray和QueryMap沒有介紹,這篇文章繼續。

QueryArray

在實際的業務開發中,我們有些業務多選的,比如一個活動有多個人參加,一個問題有多個答案等等,對於這類業務功能來說,如果是通過查詢參數提交的,它們的URL大概這樣?a=b&a=c&a=d,key值都一樣,但是對應的value不一樣。

這類URL查詢參數,就是一個數組,那麼在Gin中我們如何獲取它們呢?

這裡舉個例子,比如有一份調查問卷,問我有哪些自媒體,我選擇個人博客和微信公眾號

1 2 3 4 5 6 7 8

func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, c.QueryArray("media")) }) r.Run(":8080") }

運行代碼,在瀏覽器裡訪問http://localhost:8080/?media=blog&media=wechat,會看到如下信息:

<code>["blog","wechat"]/<code>

我們的自媒體信息,已經作為一個數組被輸出了,非常簡單,這樣我們就可以很方便的處理多選的業務。

QueryArray方法也有對應的GetQueryArray方法,區別在於返回對應的key是否存在,這裡不再舉例。

QueryArray和GetQueryArray源代碼實現已經在上一篇Golang Gin 實戰(四)| URL查詢參數的獲取和原理分析分析了,這裡不再贅述,大家可以再看下上一篇文章。

QueryMap

QueryMap其實就是把滿足一定格式的URL查詢參數,轉換為一個map,假設有a,b,c三個人,他們對應的id是123,456,789.那麼用map的方式表示,這種格式類似於:

<code>?ids[a]=123&ids[b]=456&ids[c]=789/<code>

從以上URL看,關鍵在於key,這個key必須符合map的定義,[]外面的必須相同,也就是ids這個map變量名,[]裡面的,也就是map的key不能相同,這樣就滿足了Gin定義的把URL查詢參數轉換為map的格式定義。

1 2 3

r.GET("/map", func(c *gin.Context) { c.JSON(200, c.QueryMap("ids")) })

獲取map的方法很簡單,把ids作為key即可。現在運行代碼,訪問http://localhost:8080/map?ids[a]=123&ids[b]=456&ids[c]=789,就會看到如下信息:

<code>{"a":"123","b":"456","c":"789"}/<code>

我們輸入的信息,正好被我們打印出來了。

GetQueryMap和QueryMap是一樣的,只是返回了對應的key是否存在。


Golang Gin 實戰(五)| 接收數組和 Map


QueryMap 的原理

1 2 3 4 5 6 7 8 9 10

func (c *Context) QueryMap(key string) map[string]string { dicts, _ := c.GetQueryMap(key) return dicts } func (c *Context) GetQueryMap(key string) (map[string]string, bool) { c.getQueryCache() return c.get(c.queryCache, key) }

QueryMap是通過GetQueryMap,最終都是c.get這個方法實現,我們只需要分析c.get就可以了。注意這裡同樣用到了getQueryCache進行緩存提高性能。

1 2 3 4 5 6 7 8 9 10 11 12 13

func (c *Context) get(m map[string][]string, key string) (map[string]string, bool) { dicts := make(map[string]string) exist := false for k, v := range m { if i := strings.IndexByte(k, '['); i >= 1 && k[0:i] == key { if j := strings.IndexByte(k[i+1:], ']'); j >= 1 { exist = true dicts[k[i+1:][:j]] = v[0] } } } return dicts, exist }

這段實現代碼看著比較繞,其實挺簡單,它有兩個參數,一個m其實就是緩存的所有查詢參數鍵值對queryCache,另外一個就是我們要找的key

因為Gin定義的map的URL特殊格式化,所以這裡需要判斷是否有[],如果有的話,並且key匹配,那麼這個鍵值對就是我們需要找的,把它存在dicts即可,最終返回的是這個dicts。

這裡等於是,Gin幫我們做了包裝,可以更好的把特殊格式的URL轉為map,提升了我們使用的效率,不過這種方法不常用,如果有特別的需要可以使用。

小結

接收數組是比較常用的,但是map不常用。其實對於接收參數來說,不光我們可以從URL查詢參數中獲得,還可以從提交的表單(Form)中獲得,它們的原理是大同小異的,使用方式也非常像,下一篇我們就介紹表單的使用和原理分析。


Golang Gin 實戰(五)| 接收數組和 Map


精彩文章推薦

Golang Gin 實戰(三)| 路由參數 (平臺還未審核通過)


分享到:


相關文章: