新聞中心
什么是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


咨詢
建站咨詢
