In Go bieten Kontexte einen Mechanismus zum Steuern und Abbrechen von Vorgängen. Sie ermöglichen die Weitergabe von Abbruchsignalen über Goroutinen und HTTP-Anfragen.
Bei der Verwendung von HTTP-Anfragen mit einem Kontext ist es entscheidend, den Abbruch korrekt zu handhaben. In Go 1.9 kann der Versuch, mit err == context.Canceled zu überprüfen, ob eine Anfrage abgebrochen wurde, zu falschen Ergebnissen führen.
In Go 1.13:
Die bevorzugte Methode zur Überprüfung auf Abbruch ist die Verwendung der neuen Funktion „errors.Is“:
ctx, cancel := context.WithCancel(context.Background()) cancel() r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil) _, err := http.DefaultClient.Do(r) log.Println(errors.Is(err, context.Canceled)) // Prints true
errors.Is überprüft die Fehlerkette und gibt „true“ zurück, wenn ein Fehler in der Kette mit dem bereitgestellten Kontext übereinstimmt .Fehler behoben.
In Go 1.9-1.12:
Für frühere Versionen von Go können Sie die folgende Problemumgehung verwenden:
type canceledErr struct { error } func (e *canceledErr) Cancelled() bool { return e.Error() == "context canceled" } 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) ch <- &canceledErr{err} }() cancel() log.Println((<-ch).Cancelled()) // Prints true }
Diese Problemumgehung erstellt einen benutzerdefinierten Fehlertyp cancelledErr, der den umschlossenen Fehler einbettet und eine Cancelled()-Methode zur Prüfung auf Kontextabbruch bereitstellt.
Das obige ist der detaillierte Inhalt vonWie überprüfe ich, ob eine HTTP-Anfrage in Go abgebrochen wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!