據我所知,在 Go 中使用上下文時,檢查上下文是否被取消或達到最后期限的正確方法是調用上下文。Err() 在有問題的代碼之后。所以像這樣:func myFunc(ctx context.Context) { // call some context-aware functionality result, err := SomeContextAwareFunc(ctx) // check if we hit a deadline or cancellation if ctxErr := ctx.Err(); ctxErr != nil { // handle an expired and/or cancelled context here } // process the result _ = result}但是,如果我沒有記錯的話,這代表了一個競爭條件。上下文可能在 SomeContextAwareFunc 之后但在調用 Err 函數之前過期。在這種情況下,我們會認為上下文過期會縮短SomeContextAwareFunc,但它實際上并沒有(例如,我們可以使用結果)。我在 Playground 中測試了這一點,在函數返回和調用 Err 之間人為延遲,它確實錯誤地指示了過期的上下文。https://play.golang.org/p/Rd-fhWOW-AB防止這種情況的正確方法是什么?上下文感知函數是否必須始終返回錯誤,以便調用方僅在返回錯誤時才檢查上下文?
1 回答

翻翻過去那場雪
TA貢獻2065條經驗 獲得超14個贊
如果返回上下文錯誤或包裝上下文錯誤,請使用以下代碼確定是否由于截止時間或取消而返回:SomeContextFunctionSomeContextFunction
result, err := SomeContextAwareFunc(ctx)
if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {
// deadline exceeded or canceled
} else if err != nil {
// some other eror
}
由于在 SomeContextAwareFunc 返回后,截止時間可能會過期或上下文可以取消,因此測試 SomeContextAwareFunc 的錯誤返回是確定函數失敗原因的唯一方法。
- 1 回答
- 0 關注
- 100 瀏覽
添加回答
舉報
0/150
提交
取消