Dans Go, déterminer si une demande a été annulée peut être un défi. Considérez le code suivant :
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 }
Étonnamment, ce code s'affiche faux dans Go 1.9 même si la demande aurait dû être annulée.
Dans les versions plus récentes de Go, une meilleure façon de vérifier l'annulation est d'utiliser la fonction error.Is introduite dans Go 1.13. Voici une version mise à jour du code :
import ( "context" "errors" "log" "net/http" ) func main() { // Create a context that is already canceled ctx, cancel := context.WithCancel(context.Background()) cancel() // Create the request with it r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil) // Do it, it will immediately fail because the context is canceled. _, err := http.DefaultClient.Do(r) log.Println(err) // Get http://example.com: context canceled // This prints false, because the http client wraps the context.Canceled // error into another one with extra information. log.Println(err == context.Canceled) // This prints true, because errors.Is checks all the errors in the wrap chain, // and returns true if any of them matches. log.Println(errors.Is(err, context.Canceled)) }
En utilisant error.Is, nous pouvons vérifier de manière fiable si l'erreur sous-jacente est une erreur d'annulation de contexte, même si elle a été enveloppée par une autre erreur. La fonction error.Is parcourra toute la chaîne d'erreurs et retournera true si l'une d'entre elles correspond au type d'erreur donné.
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!