欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)

 更新時(shí)間:2023年03月31日 16:22:17   作者:漁夫子?Go學(xué)堂  
這篇文章主要為大家介紹了gin框架Context?Get?Query?Param函數(shù)獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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。anygininterface{}的別名。通過該定義可知,在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)用(Deferred Code)詳解

    本文將介紹Go語言函數(shù)和方法中的延遲調(diào)用,正如名稱一樣,這部分定義不會(huì)立即執(zhí)行,一般會(huì)在函數(shù)返回前再被調(diào)用,我們通過一些示例來了解一下延遲調(diào)用的使用場景
    2022-07-07
  • Golang Gin局部和全局中間件使用詳解

    Golang Gin局部和全局中間件使用詳解

    中間件是放在客戶端和服務(wù)端的中間,當(dāng)你的客戶端對(duì)某個(gè)接口發(fā)起一個(gè)請(qǐng)求,但是在到達(dá)接口2之前,這里是有一層中間件的處理。本文詳細(xì)介紹了Golang Gin局部、全局中間件使用方法,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • 淺談Go Channel 高級(jí)實(shí)踐

    淺談Go Channel 高級(jí)實(shí)踐

    這篇文章主要介紹了淺談Go Channel 高級(jí)實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 如何在Go中將[]byte轉(zhuǎn)換為io.Reader

    如何在Go中將[]byte轉(zhuǎn)換為io.Reader

    本文主要介紹了如何在Go中將[]byte轉(zhuǎn)換為io.Reader,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang http使用踩過的坑與填坑指南

    golang http使用踩過的坑與填坑指南

    這篇文章主要介紹了golang http使用踩過的坑與填坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 詳解 Go 語言中 Map 類型和 Slice 類型的傳遞

    詳解 Go 語言中 Map 類型和 Slice 類型的傳遞

    這篇文章主要介紹了詳解 Go 語言中 Map 類型和 Slice 類型的傳遞的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Golang等多種語言轉(zhuǎn)數(shù)組成字符串舉例詳解

    Golang等多種語言轉(zhuǎn)數(shù)組成字符串舉例詳解

    今天寫代碼遇到數(shù)組轉(zhuǎn)換成字符串操作,下面這篇文章主要給大家介紹了關(guān)于Golang等多種語言轉(zhuǎn)數(shù)組成字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例

    golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例

    這篇文章主要為大家介紹了golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    這篇文章主要為大家介紹了go?sync.Once實(shí)現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • golang中如何保證精度的方法

    golang中如何保證精度的方法

    本文主要介紹了golang中如何保證精度的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論