Context in Go fournit un mécanisme pour transmettre des valeurs arbitraires avec les requêtes et suivre les annulations. Par défaut, tous les contextes partagent le même mécanisme d'annulation. Cependant, certains scénarios peuvent nécessiter un découplage de la propagation du contexte de l'annulation.
Considérons un gestionnaire HTTP qui effectue des tâches au-delà de la durée de vie de la requête. Après avoir renvoyé une réponse, le gestionnaire peut lancer une tâche asynchrone dans une goroutine. Cette tâche peut nécessiter l'accès aux valeurs de contexte, mais ne doit pas être terminée si le contexte de la demande d'origine est annulé.
WithoutCancel a été introduit dans Go 1.21, offrant un moyen simple pour créer des contextes non annulants. En utilisant cette méthode, on peut obtenir une copie du contexte d'origine qui contient toutes ses valeurs stockées mais reste indépendante de son statut d'annulation.
Avant Go 1.21, des contextes personnalisés des implémentations de contextes sans annulation étaient nécessaires. La clé est de créer un type qui satisfait à l'interface context.Context et remplace les méthodes suivantes pour empêcher l'annulation :
De plus, l'implémentation doit stocker le contexte d'origine et déléguer les appels Value() pour récupérer les valeurs stockées.
import ( "context" "github.com/mypackage/mycontext" ) func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := mycontext.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
En comprenant les principes derrière les contextes de non-annulation et en tirant parti des outils disponibles, les développeurs peuvent créer des solutions personnalisées ou utiliser la fonctionnalité intégrée de Go pour obtenir la propagation du contexte souhaité sans annulation.
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!