Heim  >  Artikel  >  Backend-Entwicklung  >  Wie überprüfe ich in Go, ob eine Anfrage storniert wurde?

Wie überprüfe ich in Go, ob eine Anfrage storniert wurde?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-08 08:55:02345Durchsuche

How to Check for Request Cancellation in Go?

Überprüfung auf Anforderungsstornierung in Go

In Go ist die Überprüfung, ob eine Anforderung storniert wurde, für die ordnungsgemäße Abwicklung asynchroner Vorgänge unerlässlich. Eine einfache Lösung besteht darin, den Kontext der Anfrage zu überwachen, der Abbruchsignale enthält.

Betrachten Sie den folgenden Code:

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
}

Dieser Code versucht, den Abbruch der Anfrage zu ermitteln, indem er den von Do( ) mit context.Canceled. In Go 1.9 wird jedoch überraschenderweise „false“ statt „true“ ausgegeben.

Korrekter Ansatz

Für Go-Versionen vor 1.13 besteht die geeignete Methode zur Überprüfung auf Stornierung darin Verwenden Sie context.Err() und vergleichen Sie seinen Rückgabewert mit context.Canceled:

if r.Context().Err() == context.Canceled {
    // Request was cancelled
}

Go 1.13

In Go 1.13 und höher wurde die Prüfung auf Abbruch gleichmäßig komfortabler mit der Einführung der Funktion „errors.Is()“. Mit dieser Funktion können Sie überprüfen, ob ein Fehler mit einem anderen Fehlertyp übereinstimmt, auch wenn er in mehrere Ebenen eingebettet ist:

if errors.Is(err, context.Canceled) {
    // Request was cancelled
}

Diese Methode gewährleistet eine genaue Abbrucherkennung, selbst wenn andere Fehler in den Kontext eingebettet sind.Abgebrochen.

Das obige ist der detaillierte Inhalt vonWie überprüfe ich in Go, ob eine Anfrage storniert wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn