首頁  >  文章  >  後端開發  >  如何在 Go 中檢查請求取消?

如何在 Go 中檢查請求取消?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-08 08:55:02345瀏覽

How to Check for Request Cancellation in Go?

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn