Dans Go, les contextes fournissent un mécanisme de contrôle et d'annulation des opérations. Ils permettent de propager des signaux d'annulation via des goroutines et des requêtes HTTP.
Lors de l'utilisation de requêtes HTTP avec un contexte, il est crucial de gérer correctement l'annulation. Dans Go 1.9, tenter de vérifier si une demande a été annulée à l'aide de err == context.Canceled peut entraîner des résultats incorrects.
Dans Go 1.13 :
La méthode préférée pour vérifier l'annulation est d'utiliser la nouvelle fonction error.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 vérifie la chaîne d'erreurs et renvoie true si une erreur dans la chaîne correspond au contexte fourni. .Erreur annulée.
Dans Go 1.9-1.12 :
Pour les versions antérieures de Go, vous pouvez utiliser la solution de contournement suivante :
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 }
Cette solution de contournement crée un type d'erreur personnalisé CancelErr qui intègre l'erreur encapsulée et fournit une méthode Cancelled() pour vérifier l'annulation du contexte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!