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

golang context接口類型方法介紹

 更新時(shí)間:2023年09月27日 10:33:00   作者:lincoln_hlf1  
這篇文章主要為大家介紹了golang context接口類型方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

摘要

在很多的 Go 開(kāi)源框架里,我們經(jīng)常能看到 context 的身影,它的使用場(chǎng)景有很多,像超時(shí)通知,取消通知都用到了 context。今天我們就來(lái)好好的認(rèn)識(shí)一下它,看看 context 的相關(guān)知識(shí)和底層原理。

context 介紹

context 從它的字面量就可以看出來(lái),是用來(lái)傳遞信息的。當(dāng)然,這種傳遞并不僅僅是將數(shù)據(jù)塞給被調(diào)用者,它還能進(jìn)行鏈?zhǔn)降膫鬟f,通過(guò)保存父子 context 關(guān)系,不斷的迭代遍歷來(lái)獲取數(shù)據(jù)。

除此之外,context 還能進(jìn)行鏈?zhǔn)降膫鞑?channel 信號(hào)。

我們知道 channel 是用來(lái)做 goroutine 通信使用的。這就使得 goroutine 之間能夠進(jìn)行鏈?zhǔn)降男盘?hào)通知了,進(jìn)而達(dá)到自上而下的通知效果。

例如通知所有跟 context 有血緣關(guān)系的 goroutine 進(jìn)行取消動(dòng)作。

Context 接口

在 Go 里并沒(méi)有直接為我們提供一個(gè)統(tǒng)一的 context 對(duì)象,而是設(shè)計(jì)了一個(gè)接口類型的 Context。然后在這些接口上來(lái)實(shí)現(xiàn)了幾種具體類型的 context。

這樣的好處就是我們只要根據(jù)開(kāi)放出來(lái)的接口定義,也能夠?qū)崿F(xiàn)屬于自己的 context,進(jìn)而跟官方的 context 一起配合使用。

在分析官方的幾種 context 之前,我們先來(lái)看看 context 要求實(shí)現(xiàn)的幾個(gè)接口:

  • Deadline() (deadline time.Time, ok bool)
  • Done() <-chan struct{}
  • Err() error
  • Value(key interface{}) interface{}

其中:

Deadline() 表示如果有截止時(shí)間的話,得返回對(duì)應(yīng) deadline 時(shí)間;如果沒(méi)有,則 ok 的值為 false。

Done() 表示關(guān)于 channel 的數(shù)據(jù)通信,而且它的數(shù)據(jù)類型是 struct{},一個(gè)空結(jié)構(gòu)體,因此在 Go 里都是直接通過(guò) close channel 來(lái)進(jìn)行通知的,不會(huì)涉及具體數(shù)據(jù)傳輸。

Err() 返回的是一個(gè)錯(cuò)誤 error,如果上面的 Done() 的 channel 沒(méi)被 close,則 error 為 nil;如果 channel 已被 close,則 error 將會(huì)返回 close 的原因,比如超時(shí)或手動(dòng)取消。

Value() 則是用來(lái)存儲(chǔ)具體數(shù)據(jù)的方法。

Context 類型

簡(jiǎn)單的看過(guò) Context 接口之后,我們來(lái)看看官方的 context 類型。主要有四種,分別是 emptyCtx,cancelCtxtimerCtx,valueCtx

  • emptyCtx:空的 context,實(shí)現(xiàn)了上面的 4 個(gè)接口,但都是直接 return 默認(rèn)值,沒(méi)有具體功能代碼。
  • cancelCtx:用來(lái)取消通知用的 context
  • timerCtx:用來(lái)超時(shí)通知用的 context
  • valueCtx:用來(lái)傳值的 context

其中:
emptyCtx 表示什么都沒(méi)有的 context,一般用作最初始的 context,作為父 context 使用。像我們常見(jiàn)的 context.Background()返回的就是 emptyCtx。

其他類型的創(chuàng)建方法如下:

  • WithCancel 方法創(chuàng)建的是 cancelCtx 類型的 context。
  • WithDeadline 方法創(chuàng)建的是 timerCtx 類型的 context。
  • WithValue 方法創(chuàng)建的是 valueCtx 類型的 context。

上面三個(gè)方法在創(chuàng)建的時(shí)候都會(huì)要求傳 parent context 進(jìn)來(lái),以此達(dá)到鏈?zhǔn)絺鬟f信息的目的。

Context 源碼

context 的源碼在 src/context/context.go 里,相信大家仔細(xì)研究,也能看到上面介紹的幾個(gè) context 對(duì)象。這邊簡(jiǎn)單解釋下 cancelCtx、timerCtx、valueCtx 的核心流程。

1)cancelCtx 、timerCtx(用來(lái)通知用的 context)

cancelCtx 、timerCtx 在創(chuàng)建的時(shí)候都會(huì)調(diào)用 propagateCancel方法,將當(dāng)前的 context 掛在 父 context 下。

接著在 Done() 方法里返回了對(duì)應(yīng)的 channel,讓調(diào)用者能夠監(jiān)聽(tīng) channel 信號(hào)。

當(dāng)要執(zhí)行取消動(dòng)作時(shí),會(huì)通過(guò) cancel 方法關(guān)閉 channel,來(lái)達(dá)到通知 goroutine 的目的。

在 channel 關(guān)閉的同時(shí)也會(huì)對(duì)子 context 調(diào)用 cancel 方法,直到?jīng)]有子 context。

cancelCtx 和 timerCtxt 不同之處就在于 cancelCtx 是手動(dòng)調(diào)用 cancel 方法來(lái)觸發(fā)取消通知;

而 timerCtxt 則通過(guò) AfterFunc 超時(shí)時(shí)間來(lái)自動(dòng)觸發(fā) cancel 方法。

2)valueCtx(用來(lái)傳值的 context)

valueCtx 通過(guò) key-value 形式來(lái)存儲(chǔ)數(shù)據(jù),當(dāng)找不到 key 時(shí),就會(huì)到 父 context 里查找,直到?jīng)]有父 context:

func (c *valueCtx) Value(key interface{}) interface{} {
    if c.key == key {
        return c.val
    }
    return c.Context.Value(key) // 到父 context 里查找
}

context 注意事項(xiàng)

最后我們來(lái)看看在使用 context 時(shí)的幾個(gè)注意事項(xiàng):

  • context 的 Done() 方法往往需要配合 select {} 使用,以監(jiān)聽(tīng)退出。
  • 盡量通過(guò)函數(shù)參數(shù)來(lái)暴露 context,不要在自定義結(jié)構(gòu)體里包含它。
  • WithValue 類型的 context 應(yīng)該盡量存儲(chǔ)一些全局的 data,而不要存儲(chǔ)一些可有可無(wú)的局部 data。
  • context 是并發(fā)安全的。
  • 一旦 context 執(zhí)行取消動(dòng)作,所有派生的 context 都會(huì)觸發(fā)取消。

以上就是golang context接口類型方法介紹的詳細(xì)內(nèi)容,更多關(guān)于golang context接口類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言goto語(yǔ)句跳轉(zhuǎn)到指定的標(biāo)簽實(shí)現(xiàn)方法

    go語(yǔ)言goto語(yǔ)句跳轉(zhuǎn)到指定的標(biāo)簽實(shí)現(xiàn)方法

    這篇文章主要介紹了go語(yǔ)言goto語(yǔ)句跳轉(zhuǎn)到指定的標(biāo)簽實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別解析

    Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別解析

    在Go語(yǔ)言中,匿名嵌套結(jié)構(gòu)體和與類型同名的嵌套結(jié)構(gòu)體不是完全等價(jià)的,它們有一些重要的區(qū)別,這篇文章主要介紹了Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • go 迭代string數(shù)組操作 go for string[]

    go 迭代string數(shù)組操作 go for string[]

    這篇文章主要介紹了go 迭代string數(shù)組操作 go for string[],具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    你在開(kāi)發(fā)或者面試過(guò)程中,有沒(méi)有遇到過(guò)?海量數(shù)據(jù)需要查重,緩存穿透怎么避免等等這樣的問(wèn)題呢?下面這個(gè)東西超棒,好好了解下,面試過(guò)關(guān)斬將,凸顯你的不一樣
    2022-10-10
  • 利用Go語(yǔ)言實(shí)現(xiàn)Raft日志同步

    利用Go語(yǔ)言實(shí)現(xiàn)Raft日志同步

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)Raft日志同步,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-05-05
  • 關(guān)于golang中死鎖的思考與學(xué)習(xí)

    關(guān)于golang中死鎖的思考與學(xué)習(xí)

    本文主要介紹了關(guān)于golang中死鎖的思考與學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang使用http client發(fā)起get和post請(qǐng)求示例

    golang使用http client發(fā)起get和post請(qǐng)求示例

    這篇文章主要介紹了golang使用http client發(fā)起get和post請(qǐng)求示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Go 內(nèi)存分配管理

    Go 內(nèi)存分配管理

    這篇文章主要介紹了Go 內(nèi)存分配管理,go 語(yǔ)言實(shí)際內(nèi)存、虛擬內(nèi)存怎么分配,延遲歸還是什么機(jī)制?本文結(jié)合監(jiān)控對(duì)內(nèi)存管理進(jìn)行了觀測(cè),深入學(xué)習(xí)golang對(duì)于內(nèi)存的管理機(jī)制,需要的朋友可以參考一下
    2022-02-02
  • Go+Vue開(kāi)發(fā)一個(gè)線上外賣(mài)應(yīng)用的流程(用戶名密碼和圖形驗(yàn)證碼)

    Go+Vue開(kāi)發(fā)一個(gè)線上外賣(mài)應(yīng)用的流程(用戶名密碼和圖形驗(yàn)證碼)

    這篇文章主要介紹了Go+Vue開(kāi)發(fā)一個(gè)線上外賣(mài)應(yīng)用(用戶名密碼和圖形驗(yàn)證碼),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Golang如何用gorm實(shí)現(xiàn)分頁(yè)的功能

    Golang如何用gorm實(shí)現(xiàn)分頁(yè)的功能

    這篇文章主要介紹了Golang如何用gorm實(shí)現(xiàn)分頁(yè)的功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評(píng)論

阿坝县| 吉木萨尔县| 澎湖县| 阳信县| 黄大仙区| 平阳县| 江都市| 乌审旗| 岳阳市| 新和县| 肃宁县| 长治县| 二连浩特市| 雷州市| 海宁市| 甘肃省| 山丹县| 察隅县| 社旗县| 南城县| 舞阳县| 金乡县| 木兰县| 阿荣旗| 罗江县| 三门县| 科尔| 那坡县| 洪湖市| 木里| 广南县| 云阳县| 抚远县| 陕西省| 万载县| 遂溪县| 斗六市| 黔西县| 徐州市| 平度市| 莎车县|