最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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字段、動態(tài)路由中路徑中的參數的Params字段、url查詢中查詢參數的queryCache字段以及form表單中urlencode參數的formCache字段。具體可以參考下圖:

以上就是gin框架Context如何獲取Get Query Param函數數據的詳細內容,更多關于gin框架Context數據獲取的資料請關注腳本之家其它相關文章!

相關文章

  • Golang?中的?strconv?包常用函數及用法詳解

    Golang?中的?strconv?包常用函數及用法詳解

    strconv是Golang中一個非常常用的包,主要用于字符串和基本數據類型之間的相互轉換,這篇文章主要介紹了Golang中的strconv包,需要的朋友可以參考下
    2023-06-06
  • Golang并發(fā)控制之errgroup使用詳解

    Golang并發(fā)控制之errgroup使用詳解

    errgroup?是?Go?官方庫?x?中提供的一個非常實用的工具,用于并發(fā)執(zhí)行多個?goroutine,并且方便的處理錯誤,下面就跟隨小編一起來了解下的它的具體使用吧
    2024-11-11
  • Golang切片刪除指定元素的三種方法對比

    Golang切片刪除指定元素的三種方法對比

    Go語言并沒有提供用于刪除元素的語法或接口,而是通過利用切片本身的特性來刪除元素—追加元素,這篇文章主要給大家介紹了關于Golang切片刪除指定元素的三種方法,需要的朋友可以參考下
    2022-06-06
  • 超越傳統(tǒng):Go語言并發(fā)編程的新境界

    超越傳統(tǒng):Go語言并發(fā)編程的新境界

    Go語言是一種開源的編程語言,以其強大的并發(fā)編程能力而聞名,本文將介紹Go語言并發(fā)編程的新境界,探討如何利用Go語言的特性來實現高效的并發(fā)編程,需要的朋友可以參考下
    2023-10-10
  • Go語言中日志的規(guī)范使用建議分享

    Go語言中日志的規(guī)范使用建議分享

    在任何服務端的語言項目中,日志是至關重要的組成部分,本文為大家整理了一些如何規(guī)范使用GO語言日志的建議,以及相應的實際示例,希望對大家有事幫助
    2024-01-01
  • go語言interface接口繼承多態(tài)示例及定義解析

    go語言interface接口繼承多態(tài)示例及定義解析

    這篇文章主要為大家介紹了go語言interface接口繼承多態(tài)示例及定義解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • 解決goland新建項目文件名為紅色的問題

    解決goland新建項目文件名為紅色的問題

    這篇文章主要介紹了解決goland新建項目文件名為紅色的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 使用golang進行http,get或postJson請求

    使用golang進行http,get或postJson請求

    這篇文章主要為大家詳細介紹了如何使用golang進行http,get或postJson請求,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-12-12
  • Go語言實現的最簡單數獨解法

    Go語言實現的最簡單數獨解法

    前面給大家介紹過使用javascript實現的簡單的數獨解法,小伙伴們都非常喜歡,今天我們再來分享一則go語言實現的簡單的數獨解法,有需要的小伙伴來參考下。
    2015-03-03
  • golang copy函數使用的坑

    golang copy函數使用的坑

    本文主要介紹了golang copy函數使用的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論

聂荣县| 朔州市| 沙洋县| 察雅县| 新昌县| 南召县| 南投市| 阳东县| 调兵山市| 阜新| 临清市| 丰都县| 诸城市| 北海市| 明溪县| 许昌市| 理塘县| 城固县| 大连市| 宁国市| 古丈县| 晋中市| 涿州市| 张家港市| 大丰市| 南丹县| 舒兰市| 门源| 忻城县| 洛川县| 家居| 香河县| 三明市| 礼泉县| 贵州省| 永川市| 大荔县| 开化县| 筠连县| 荔浦县| 曲周县|