Dans le package HTTP de Go, la fonction HandleFunc permet d'enregistrer une fonction de gestionnaire pour traiter les requêtes HTTP entrantes. Bien que la définition de valeurs de contexte dans un gestionnaire soit une pratique courante, la détermination de l'approche optimale peut soulever des préoccupations.
Une approche consiste à utiliser la fonction WithValue du package de contexte pour définir une valeur de contexte dans un gestionnaire. Cependant, il est important de noter que l'utilisation suivante peut introduire un problème potentiel :
func setValue(r *http.Request, val string) { ctx := context.WithValue(r.Context(), myContext, val) *r = *r.WithContext(ctx) }
L'attribution de *r à un nouvel objet de requête peut amener le code de la pile à utiliser une valeur de contexte incorrecte. Pour résoudre ce problème, l'approche recommandée consiste à créer une copie superficielle de la requête à l'aide de WithContext et à renvoyer un pointeur vers celle-ci :
func setValue(r *http.Request, val string) *http.Request { return r.WithContext(context.WithValue(r.Context(), myContext, val)) }
En renvoyant un pointeur vers la copie superficielle, vous vous assurez que la valeur de contexte correcte est utilisé tout au long du pipeline de traitement des demandes. Si le gestionnaire appelle d'autres gestionnaires, transmettez la requête modifiée au gestionnaire suivant :
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r = setValue(r, "foobar") someOtherHandler.ServeHTTP(w, r) })
Cette approche définit efficacement les valeurs de contexte dans les gestionnaires HTTP tout en évitant les pièges potentiels associés à la modification de l'objet de requête d'origine.
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!