Ü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!