概述
在golang官方文檔context package - context - Go Packages中是這樣介紹context包的:
在context包中定義了context類型來在不同的Goroutine 之間傳遞上下文,攜帶截止時間、取消信號以及攜帶上下文的系統(tǒng)參數(shù)(k-v)的類型。對服務(wù)器的傳入請求應(yīng)該創(chuàng)建上下文,對服務(wù)器的傳出調(diào)用應(yīng)該接受上下文。它們之間的函數(shù)調(diào)用鏈必須傳播上下文,可以選擇將其替換為使用WithCancel、WithDeadline、WithTimeout或WithValue創(chuàng)建的派生上下文。當(dāng)一個Context被取消時,所有從它派生的Context也會被取消。WithCancel、WithDeadline和WithTimeout函數(shù)使用。
Context 應(yīng)該是第一個參數(shù),通常命名為 ctx:
func DoSomething(ctx context.Context, arg Arg) error {
// ... use ctx ...
}
即使函數(shù)允許,也不要傳遞nil上下文。通過上下文。如果您不確定要使用哪個上下文,則TODO。僅將上下文值用于傳輸進程和api的請求作用域數(shù)據(jù),不能用于向函數(shù)傳遞可選參數(shù)。同一個Context可以被傳遞給運行在不同例程中的函數(shù);上下文對于多個例程同時使用是安全的。?
Context誕生的原因
其實在 Context包誕生之前,也有一種叫做 "context" 的機制,只不過它是私有的,只能在 Go 標準庫內(nèi)部使用。而在 Go 1.7 中,標準庫將 context 機制公開了出來,使得開發(fā)者可以在自己的代碼中使用它。 引入 context 的主要原因是為了解決在并發(fā)編程中的一些問題,比如在一個請求處理過程中,可能會啟動多個 goroutine 來處理不同的任務(wù),這些任務(wù)可能需要共享一些上下文信息,比如請求的截止時間、請求的 ID 等等。如果沒有一個統(tǒng)一的機制來管理這些上下文信息,那么代碼就會變得非?;靵y,難以維護。 通過引入 context,開發(fā)者可以將這些上下文信息封裝在一個 context 對象中,并將其傳遞給各個 goroutine,從而實現(xiàn)了上下文信息的統(tǒng)一管理。這樣一來,代碼就變得更加清晰、易于理解和維護了。文章來源:http://www.zghlxwxcb.cn/news/detail-738459.html
在Context誕生之前是怎么做的?
多個文章來源地址http://www.zghlxwxcb.cn/news/detail-738459.html
到了這里,關(guān)于Golang:淺析Context包的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!