gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)
gin框架
在使用gin框架處理一次請求的過程中,可以通過Context結構體提供的方法獲取或設置一個指定key的值。在Context中有多個通過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中的其他無關字段):
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。any是gin中interface{}的別名。通過該定義可知,在Keys字段中鍵必須是string類型,值可以是任意類型。
這個Keys中的值又來源于哪里呢?是在gin服務在處理請求時通過Context.Set函數(shù)設置的。Keys里的數(shù)據(jù)的生命周期是本次請求,作用域范圍也僅限于本次請求。請求結束了,Keys里的值也就結束了。
同時,Context.Keys字段的初始化也采用了lazy模式。即在使用Context.Set函數(shù)時才進行初始化的。

對于Get函數(shù)來說,還有一些GetXXX的輔助函數(shù),比如:MustGet、GetString、GetBool、GetInt、GetInt64等等,也都是從Keys中獲取數(shù)據(jù)。
Context中Param函數(shù)的
Context.Param(key string)函數(shù)是從正則路徑中獲取對應的匹配數(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ù)的值會解析到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
}
比如,我們請求的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函數(shù)的數(shù)據(jù)源
Context.PostForm(key string) 函數(shù)是從form表單的urlencode編碼的集合中獲取數(shù)據(jù)。這里是form表單中以urlencoded形式編碼的key/value值。如果是上傳的文件,則不能通過該函數(shù)獲取。
在gin框架中,會把form表單的數(shù)據(jù)緩存到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類型的參數(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>
總結
本文總結了gin框架中使用Context結構體中獲取指定key的值的各種函數(shù)的數(shù)據(jù)來源。通過Context中Keys字段、動態(tài)路由中路徑中的參數(shù)的Params字段、url查詢中查詢參數(shù)的queryCache字段以及form表單中urlencode參數(shù)的formCache字段。具體可以參考下圖:

以上就是gin框架Context如何獲取Get Query Param函數(shù)數(shù)據(jù)的詳細內容,更多關于gin框架Context數(shù)據(jù)獲取的資料請關注腳本之家其它相關文章!
相關文章
Go語言函數(shù)的延遲調用(Deferred Code)詳解
本文將介紹Go語言函數(shù)和方法中的延遲調用,正如名稱一樣,這部分定義不會立即執(zhí)行,一般會在函數(shù)返回前再被調用,我們通過一些示例來了解一下延遲調用的使用場景2022-07-07
golang操作連接數(shù)據(jù)庫實現(xiàn)mysql事務示例
這篇文章主要為大家介紹了golang操作連接數(shù)據(jù)庫實現(xiàn)mysql事務示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04

