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

golang context接口類型方法介紹

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

摘要

在很多的 Go 開源框架里,我們經常能看到 context 的身影,它的使用場景有很多,像超時通知,取消通知都用到了 context。今天我們就來好好的認識一下它,看看 context 的相關知識和底層原理。

context 介紹

context 從它的字面量就可以看出來,是用來傳遞信息的。當然,這種傳遞并不僅僅是將數據塞給被調用者,它還能進行鏈式的傳遞,通過保存父子 context 關系,不斷的迭代遍歷來獲取數據。

除此之外,context 還能進行鏈式的傳播 channel 信號。

我們知道 channel 是用來做 goroutine 通信使用的。這就使得 goroutine 之間能夠進行鏈式的信號通知了,進而達到自上而下的通知效果。

例如通知所有跟 context 有血緣關系的 goroutine 進行取消動作。

Context 接口

在 Go 里并沒有直接為我們提供一個統一的 context 對象,而是設計了一個接口類型的 Context。然后在這些接口上來實現了幾種具體類型的 context。

這樣的好處就是我們只要根據開放出來的接口定義,也能夠實現屬于自己的 context,進而跟官方的 context 一起配合使用。

在分析官方的幾種 context 之前,我們先來看看 context 要求實現的幾個接口:

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

其中:

Deadline() 表示如果有截止時間的話,得返回對應 deadline 時間;如果沒有,則 ok 的值為 false。

Done() 表示關于 channel 的數據通信,而且它的數據類型是 struct{},一個空結構體,因此在 Go 里都是直接通過 close channel 來進行通知的,不會涉及具體數據傳輸。

Err() 返回的是一個錯誤 error,如果上面的 Done() 的 channel 沒被 close,則 error 為 nil;如果 channel 已被 close,則 error 將會返回 close 的原因,比如超時或手動取消。

Value() 則是用來存儲具體數據的方法。

Context 類型

簡單的看過 Context 接口之后,我們來看看官方的 context 類型。主要有四種,分別是 emptyCtx,cancelCtx,timerCtx,valueCtx

  • emptyCtx:空的 context,實現了上面的 4 個接口,但都是直接 return 默認值,沒有具體功能代碼。
  • cancelCtx:用來取消通知用的 context
  • timerCtx:用來超時通知用的 context
  • valueCtx:用來傳值的 context

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

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

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

上面三個方法在創(chuàng)建的時候都會要求傳 parent context 進來,以此達到鏈式傳遞信息的目的。

Context 源碼

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

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

cancelCtx 、timerCtx 在創(chuàng)建的時候都會調用 propagateCancel方法,將當前的 context 掛在 父 context 下。

接著在 Done() 方法里返回了對應的 channel,讓調用者能夠監(jiān)聽 channel 信號。

當要執(zhí)行取消動作時,會通過 cancel 方法關閉 channel,來達到通知 goroutine 的目的。

在 channel 關閉的同時也會對子 context 調用 cancel 方法,直到沒有子 context。

cancelCtx 和 timerCtxt 不同之處就在于 cancelCtx 是手動調用 cancel 方法來觸發(fā)取消通知;

而 timerCtxt 則通過 AfterFunc 超時時間來自動觸發(fā) cancel 方法。

2)valueCtx(用來傳值的 context)

valueCtx 通過 key-value 形式來存儲數據,當找不到 key 時,就會到 父 context 里查找,直到沒有父 context:

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

context 注意事項

最后我們來看看在使用 context 時的幾個注意事項:

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

以上就是golang context接口類型方法介紹的詳細內容,更多關于golang context接口類型的資料請關注腳本之家其它相關文章!

相關文章

  • Goland的設置與配置全過程

    Goland的設置與配置全過程

    這篇文章主要介紹了Goland的設置與配置全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Go設計模式之訪問者模式講解和代碼示例

    Go設計模式之訪問者模式講解和代碼示例

    訪問者是一種行為設計模式, 允許你在不修改已有代碼的情況下向已有類層次結構中增加新的行為,本文將通過代碼示例給大家詳細的介紹一下Go設計模式之訪問者模式,需要的朋友可以參考下
    2023-08-08
  • 從錯誤中學習改正Go語言六個壞習慣提高編程技巧

    從錯誤中學習改正Go語言六個壞習慣提高編程技巧

    這篇文章主要為大家介紹了從錯誤中學習改正Go語言五個壞習慣提高編程技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang控制協程執(zhí)行順序方法詳解

    Golang控制協程執(zhí)行順序方法詳解

    這篇文章主要介紹了Golang控制協程執(zhí)行順序的方法,Golang的語法和運行時直接內置了對并發(fā)的支持。Golang里的并發(fā)指的是能讓某個函數獨立于其他函數運行的能力
    2022-11-11
  • Go語言如何實現限制用戶請求

    Go語言如何實現限制用戶請求

    這篇文章主要為大家詳細介紹了Go語言如何實現限制用戶 1 分鐘內最多請求 1000 次,文中為大家整理了三個常用的方法,希望對大家有所幫助
    2025-01-01
  • 深入解析Go template模板使用詳解

    深入解析Go template模板使用詳解

    這篇文章主要介紹了深入解析Go template模板使用詳解,需要的朋友可以參考下
    2022-04-04
  • GO語言ini配置文件的讀取的操作

    GO語言ini配置文件的讀取的操作

    這篇文章主要介紹了GO語言ini配置文件的讀取的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang使用CopyIn進行批量創(chuàng)建的示例代碼

    Golang使用CopyIn進行批量創(chuàng)建的示例代碼

    本文主要介紹了Golang使用CopyIn進行批量創(chuàng)建的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Go語言運算符案例講解

    Go語言運算符案例講解

    這篇文章主要介紹了Go語言運算符案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • GO語言標準錯誤處理機制error用法實例

    GO語言標準錯誤處理機制error用法實例

    這篇文章主要介紹了GO語言標準錯誤處理機制error用法,實例分析了錯誤處理機制的具體用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12

最新評論