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

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)求的過(guò)程中,可以通過(guò)Context結(jié)構(gòu)體提供的方法獲取或設(shè)置一個(gè)指定key的值。在Context中有多個(gè)通過(guò)key獲取值的函數(shù):GetString(key string) (s string)、Param(key string) stringQuery(key string) (value string)、PostForm(key string) (value string)、GetHeader(key string)、Cookie(name string)等。

那么,這些函數(shù)到底是從哪里獲取數(shù)據(jù)的呢?本文就帶你一起來(lái)探究這些函數(shù)底層的數(shù)據(jù)源。

Context中Get函數(shù)的數(shù)據(jù)源

Context.Get函數(shù)是從Context.Keys字段中獲取的數(shù)據(jù)。我們看下Context的Keys字段的定義(為方便文章說(shuō)明,我們省略了Context中的其他無(wú)關(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{}的別名。通過(guò)該定義可知,在Keys字段中鍵必須是string類型,值可以是任意類型。

這個(gè)Keys中的值又來(lái)源于哪里呢?是在gin服務(wù)在處理請(qǐng)求時(shí)通過(guò)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ù)來(lái)說(shuō),還有一些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",那么通過(guò)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ù)則來(lái)源于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=,那么就可以通過(guò)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值。如果是上傳的文件,則不能通過(guò)該函數(shù)獲取。

在gin框架中,會(huì)把form表單的數(shù)據(jù)緩存到Context的formCache中。獲取時(shí),會(huì)直接從formCache中獲取。如下:

type??Context?struct?{
?formCache?url.Values
}

通過(guò)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ù)來(lái)源。通過(guò)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)文章

  • Golang?中的?strconv?包常用函數(shù)及用法詳解

    Golang?中的?strconv?包常用函數(shù)及用法詳解

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

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

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

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

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

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

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

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

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

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

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

    解決goland新建項(xiàng)目文件名為紅色的問(wèn)題

    這篇文章主要介紹了解決goland新建項(xiàng)目文件名為紅色的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 使用golang進(jìn)行http,get或postJson請(qǐng)求

    使用golang進(jìn)行http,get或postJson請(qǐng)求

    這篇文章主要為大家詳細(xì)介紹了如何使用golang進(jìn)行http,get或postJson請(qǐng)求,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-12-12
  • Go語(yǔ)言實(shí)現(xiàn)的最簡(jiǎn)單數(shù)獨(dú)解法

    Go語(yǔ)言實(shí)現(xiàn)的最簡(jiǎn)單數(shù)獨(dú)解法

    前面給大家介紹過(guò)使用javascript實(shí)現(xiàn)的簡(jiǎn)單的數(shù)獨(dú)解法,小伙伴們都非常喜歡,今天我們?cè)賮?lái)分享一則go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單的數(shù)獨(dú)解法,有需要的小伙伴來(lái)參考下。
    2015-03-03
  • golang copy函數(shù)使用的坑

    golang copy函數(shù)使用的坑

    本文主要介紹了golang copy函數(shù)使用的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

岳池县| 常山县| 孟津县| 弥勒县| 沁水县| 巴彦淖尔市| 彭泽县| 澄迈县| 西华县| 铁力市| 玉田县| 天水市| 塔城市| 盐池县| 四川省| 淮滨县| 奉贤区| 宁陕县| 韩城市| 剑川县| 南岸区| 宜阳县| 朝阳区| 平昌县| 友谊县| 天水市| 庆云县| 丘北县| 海阳市| 丁青县| 婺源县| 申扎县| 行唐县| 井冈山市| 洮南市| 庄浪县| 兴化市| 尼勒克县| 海城市| 宁远县| 普兰县|