Maison  >  Article  >  développement back-end  >  Comment vérifier l’annulation d’une demande dans Go ?

Comment vérifier l’annulation d’une demande dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 08:55:02352parcourir

How to Check for Request Cancellation in Go?

Vérification de l'annulation d'une demande dans Go

Dans Go, vérifier si une demande a été annulée est essentiel pour gérer correctement les opérations asynchrones. Une solution simple consiste à surveiller le contexte de la demande, qui héberge les signaux d'annulation.

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
}

Ce code tente de déterminer l'annulation de la demande en comparant l'erreur renvoyée par Do( ) avec contexte.Annulé. Cependant, dans Go 1.9, il affiche étonnamment faux au lieu de vrai.

Approche correcte

Pour les versions Go antérieures à 1.13, la manière appropriée de vérifier l'annulation est de utilisez context.Err() et comparez sa valeur de retour avec context.Canceled :

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

Go 1.13

Dans Go 1.13 et versions ultérieures, la vérification de l'annulation est devenue uniforme plus pratique avec l’introduction de la fonction error.Is(). Cette fonction vous permet de vérifier si une erreur correspond à un autre type d'erreur, même si elle est enveloppée dans plusieurs couches :

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

Cette méthode garantit une détection précise de l'annulation même lorsque d'autres erreurs sont enveloppées dans le contexte.Annulé.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn