gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)
gin框架
在使用gin框架處理一次請(qǐng)求的過程中,可以通過Context結(jié)構(gòu)體提供的方法獲取或設(shè)置一個(gè)指定key的值。在Context中有多個(gè)通過key獲取值的函數(shù):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)
等。
那么,這些函數(shù)到底是從哪里獲取數(shù)據(jù)的呢?本文就帶你一起來探究這些函數(shù)底層的數(shù)據(jù)源。
Context中Get函數(shù)的數(shù)據(jù)源
Context.Get函數(shù)是從Context.Keys字段中獲取的數(shù)據(jù)。我們看下Context的Keys字段的定義(為方便文章說明,我們省略了Context中的其他無關(guān)字段):
type?Context?struct?{ ?//?Keys?is?a?key/value?pair?exclusively?for?the?context?of?each?request. ?Keys?map[string]any }
可以看到,Keys
是一個(gè)map[string]any
類型的map。any
是gin
中interface{}
的別名。通過該定義可知,在Keys字段中鍵必須是string類型,值可以是任意類型。
這個(gè)Keys中的值又來源于哪里呢?是在gin服務(wù)在處理請(qǐng)求時(shí)通過Context.Set函數(shù)設(shè)置的。Keys里的數(shù)據(jù)的生命周期是本次請(qǐng)求,作用域范圍也僅限于本次請(qǐng)求。請(qǐng)求結(jié)束了,Keys里的值也就結(jié)束了。
同時(shí),Context.Keys
字段的初始化也采用了lazy模式。即在使用Context.Set函數(shù)時(shí)才進(jìn)行初始化的。
對(duì)于Get函數(shù)來說,還有一些GetXXX的輔助函數(shù),比如:MustGet、GetString、GetBool、GetInt、GetInt64等等,也都是從Keys中獲取數(shù)據(jù)。
Context中Param函數(shù)的
Context.Param(key string)函數(shù)是從正則路徑中獲取對(duì)應(yīng)的匹配數(shù)據(jù)值。在gin中,正則路徑的參數(shù)是被解析到Context.Params字段中的。其字段定義如下:
type?Context?struct?{ ?Params???Params } type?Params?[]Param type?Param?struct?{ ?Key???string ?Value?string }
例如,我們定義了正則路徑 "/user/:id",那么通過c.Param("id")函數(shù)就能獲取到本次路由中的id參數(shù)值。
router.GET("/user/:id",?func(c?*gin.Context)?{ ?//?a?GET?request?to?/user/john ?id?:=?c.Param("id")?//?id?==?"john" })
Context中Query函數(shù)的數(shù)據(jù)源
Context.Query函數(shù)是獲取的url中的查詢參數(shù)的值。在gin中,將查詢參數(shù)的值會(huì)解析到Context中的queryCache
字段中,而queryCache的數(shù)據(jù)則來源于Context.Request.URL.RawQuery中。如下:
type?Context?struct?{ ?//?queryCache?caches?the?query?result?from?c.Request.URL.Query(). ?queryCache?url.Values }
比如,我們請(qǐng)求的url是 GET /path?id=1234&name=Manu&value=
,那么就可以通過Query查詢到id、name和value對(duì)應(yīng)的值:
c.Query("id")?==?"1234" c.Query("name")?==?"Manu" c.Query("value")?==?"" c.Query("wtf")?==?""
Context中的PostForm函數(shù)的數(shù)據(jù)源
Context.PostForm(key string) 函數(shù)是從form表單的urlencode編碼的集合中獲取數(shù)據(jù)。這里是form表單中以u(píng)rlencoded形式編碼的key/value值。如果是上傳的文件,則不能通過該函數(shù)獲取。
在gin框架中,會(huì)把form表單的數(shù)據(jù)緩存到Context的formCache
中。獲取時(shí),會(huì)直接從formCache中獲取。如下:
type??Context?struct?{ ?formCache?url.Values }
通過formCache字段的類型為url.Values也可以知道,該字段存儲(chǔ)的只有form表單中的urlencode編碼的key/value值。比如,有如下form表單,那么formCache中的值就是username和password。而action值中的utm_source=login以及file類型的參數(shù)是不在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>
總結(jié)
本文總結(jié)了gin框架中使用Context結(jié)構(gòu)體中獲取指定key的值的各種函數(shù)的數(shù)據(jù)來源。通過Context中Keys字段、動(dòng)態(tài)路由中路徑中的參數(shù)的Params字段、url查詢中查詢參數(shù)的queryCache字段以及form表單中urlencode參數(shù)的formCache字段。具體可以參考下圖:
以上就是gin框架Context如何獲取Get Query Param函數(shù)數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于gin框架Context數(shù)據(jù)獲取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解
本文將介紹Go語言函數(shù)和方法中的延遲調(diào)用,正如名稱一樣,這部分定義不會(huì)立即執(zhí)行,一般會(huì)在函數(shù)返回前再被調(diào)用,我們通過一些示例來了解一下延遲調(diào)用的使用場景2022-07-07如何在Go中將[]byte轉(zhuǎn)換為io.Reader
本文主要介紹了如何在Go中將[]byte轉(zhuǎn)換為io.Reader,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Golang等多種語言轉(zhuǎn)數(shù)組成字符串舉例詳解
今天寫代碼遇到數(shù)組轉(zhuǎn)換成字符串操作,下面這篇文章主要給大家介紹了關(guān)于Golang等多種語言轉(zhuǎn)數(shù)組成字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例
這篇文章主要為大家介紹了golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04go?sync.Once實(shí)現(xiàn)高效單例模式詳解
這篇文章主要為大家介紹了go?sync.Once實(shí)現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03