日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Golang中Context包基礎(chǔ)知識(shí)詳解

什么是context.Context?

context.Context是Golang標(biāo)準(zhǔn)庫(kù)提供的接口(context包對(duì)此接口有多種實(shí)現(xiàn)),該接口提供了四個(gè)抽象法:

成都創(chuàng)新互聯(lián)公司專注網(wǎng)站設(shè)計(jì),以設(shè)計(jì)驅(qū)動(dòng)企業(yè)價(jià)值的持續(xù)增長(zhǎng),網(wǎng)站,看似簡(jiǎn)單卻每一個(gè)企業(yè)都需要——設(shè)計(jì),看似簡(jiǎn)潔卻是每一位設(shè)計(jì)師的心血 10年來(lái),我們只專注做網(wǎng)站。認(rèn)真對(duì)待每一個(gè)客戶,我們不用口頭的語(yǔ)言來(lái)吹擂我們的優(yōu)秀,超過(guò)千家的成功案例見(jiàn)證著我們的成長(zhǎng)。

type Context interface {
  Deadline() (deadline time.Time, ok bool)
  Done() <-chan struct{}
  Err() error
  Value(key any) any
}
  • Deadline方法,返回context.Context被取消的時(shí)間點(diǎn),也就是需要完成任務(wù)的截止時(shí)間,連續(xù)調(diào)用返回相同的結(jié)果。
  • Done方法, 當(dāng)前context被取消后,返回的channel就會(huì)被close。如果當(dāng)前context不會(huì)被取消則返回nil,連續(xù)調(diào)用返回相同的結(jié)果。
  • Err方法,返回context.Context結(jié)束的錯(cuò)誤
  • 如果Done方法返回的channel沒(méi)有關(guān)閉,返回nil
  • 如果Done方法返回的channel被關(guān)閉了,返回一個(gè)非nil的值,連續(xù)調(diào)用返回相同的結(jié)果
  • context如果被取消了,返回 “context canceled”錯(cuò)誤
  • 如果執(zhí)行時(shí)間超過(guò)了Deadline,返回 “context deadline exceeded”錯(cuò)誤
  • Value方法,返回Context中key對(duì)應(yīng)的value值,對(duì)于同一個(gè)context,多次調(diào)用獲取同一個(gè)key的值會(huì)返回相同的結(jié)果。

如何構(gòu)造context.Context對(duì)象?

context包提供了兩個(gè)方法:

func Background() Context{}
func TODO() Context {}
  • Background方法,返回一個(gè)空Context對(duì)象,所有Context對(duì)象的的源頭都應(yīng)該是這個(gè)空Context對(duì)象。
  • TODO方法,也是返回一個(gè)空Context對(duì)象,如果還不確定使用何種Context時(shí),可以使用此方法創(chuàng)建的Context對(duì)象。

目前context.Background和context.TODO方法沒(méi)有太大差別,返回的都是空Context,只是在使用場(chǎng)景和語(yǔ)義上稍有不同。其他的Context都需要基于構(gòu)造好的Context衍生出來(lái),一個(gè)Context可以衍生多個(gè)子Context。

衍生Context方法

context包提供如下四個(gè)以With開(kāi)頭的衍生Context的方法:

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val any) Context

前三種方法的相同點(diǎn)都是基于parent Context生成一個(gè)新的Context并返回一個(gè)CancelFunc方法,CancelFunc調(diào)用后,當(dāng)前Context和基于新Context的子Context都會(huì)被取消。不同點(diǎn)在于WithCancel方法返回的CancelFunc需要手動(dòng)調(diào)用;WithDeadline方法可以設(shè)置一個(gè)時(shí)間點(diǎn),到這個(gè)時(shí)間點(diǎn)后會(huì)自動(dòng)調(diào)用CancelFunc,當(dāng)然也可以手動(dòng)調(diào)用;WithTimeout方法可以設(shè)置時(shí)長(zhǎng),超過(guò)指定時(shí)長(zhǎng)后會(huì)自動(dòng)調(diào)用CancelFunc,當(dāng)然也可以手動(dòng)調(diào)用。

WithValue方法可以生成一個(gè)綁定指定的鍵值對(duì)數(shù)據(jù)的Context,可以通過(guò)context.Value(Key) 獲取指定key的值。

使用context包需要注意的點(diǎn)

  • 需要Context參數(shù)的方法,把Context作為第一個(gè)參數(shù)(千萬(wàn)不要把Context放在結(jié)構(gòu)體中,然后將結(jié)構(gòu)體作為參數(shù)傳遞)。
  • 使用context.Background方法構(gòu)造的Context對(duì)象應(yīng)該作為根Context, 用于衍生其他Context。
  • 方法需要傳入的Context類型不確定的時(shí)候,傳入使用context.TODO構(gòu)造的Context (千萬(wàn)不要傳入nil)。
  • 不要濫用context.WithValue傳遞數(shù)據(jù),只用來(lái)傳遞必須的數(shù)據(jù)。
  • Context是并發(fā)安全的,同一個(gè)Context可以傳遞給多個(gè)goroutine,可被多個(gè)goroutine同時(shí)訪問(wèn)。

網(wǎng)頁(yè)名稱:Golang中Context包基礎(chǔ)知識(shí)詳解
標(biāo)題URL:http://m.5511xx.com/article/dpchpod.html