在 Go 中檢查請求取消
在 Go 中,檢查請求是否被取消對於優雅地處理非同步操作至關重要。一個簡單的解決方案是監視請求的上下文,其中包含取消訊號。
考慮以下程式碼:
package main import ( "context" "log" "net/http" ) func main() { r, _ := http.NewRequest("GET", "http://example.com", nil) ctx, cancel := context.WithCancel(context.Background()) r = r.WithContext(ctx) ch := make(chan bool) go func() { _, err := http.DefaultClient.Do(r) log.Println(err == context.Canceled) ch <- true }() cancel() <-ch }
此程式碼嘗試透過比較 Do( 傳回的錯誤來決定要求取消) 與上下文。已取消。然而,在 Go 1.9 中,令人驚訝的是,它打印 false 而不是 true。
正確方法
對於1.13 之前的Go 版本,檢查取消的正確方法是使用context.Err() 並將其傳回值與context.Canceled 進行比較:
if r.Context().Err() == context.Canceled { // Request was cancelled }
Go 1.13
在 Go 1.13 及更高版本中,檢查取消變得均勻引入errors.Is()函數更方便。此函數可讓您檢查錯誤是否與另一種錯誤類型匹配,即使它包裝在多個層中:
if errors.Is(err, context.Canceled) { // Request was cancelled }
即使其他錯誤包裝在context.Canceled 中,此方法也可確保準確的取消檢測。
以上是如何在 Go 中檢查請求取消?的詳細內容。更多資訊請關注PHP中文網其他相關文章!