Maison  >  Article  >  développement back-end  >  Comment transmettre des arguments supplémentaires aux fonctions de gestionnaire dans Gorilla Mux ?

Comment transmettre des arguments supplémentaires aux fonctions de gestionnaire dans Gorilla Mux ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 15:28:02824parcourir

How to Pass Additional Arguments to Handler Functions in Gorilla Mux?

Gestion des arguments du gestionnaire avec Gorilla Mux

Dans Gorilla Mux, par défaut, les gestionnaires reçoivent uniquement http.ResponseWriter et *http.Request. Cependant, il existe des scénarios dans lesquels il est nécessaire de transmettre des arguments supplémentaires aux gestionnaires, comme un objet de connexion à une base de données.

Approche 1 : gestionnaire en tant que méthode d'un type personnalisé

Une façon d'y parvenir est pour définir un type personnalisé qui contient les données supplémentaires et implémente l'interface http.HandlerFunc.

type UserHandler struct {
    db *gorm.DB
}

func (h UserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // here you can use db
}

// usage:
db := createDB()
users := UserHandler{db: db}
router.HandleFunc("/users/{id}", users.ServeHTTP)

Approche 2 : Clôture Fonction

Une autre option consiste à utiliser une fonction de fermeture pour envelopper le gestionnaire réel et injecter l'argument supplémentaire.

func showUserHandler(db *gorm.DB) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // here you can use db
    }
}

// usage:
db := createDB()
router.HandleFunc("/users/{id}", showUserHandler(db))

Approche 3 : variables globales

Dans certains scénarios, l'utilisation de variables globales peut être acceptable, en particulier pour les ressources partagées telles que les connexions à une base de données. Cependant, il est important de les utiliser avec parcimonie et de comprendre les inconvénients potentiels.

var db *gorm.DB = createDB()

func showUserHandler(w http.ResponseWriter, r *http.Request) {
    // here you can use db
}

// usage:
router.HandleFunc("/users/{id}", showUserHandler)

Conseils

  • Il n'est généralement pas recommandé d'utiliser une variable globale pour l'objet de base de données, car elle peut entraîner des problèmes de concurrence.
  • La meilleure approche dépend de vos besoins spécifiques.
  • Pour une base de données unique objet, l'approche de la fonction de fermeture ou de la méthode du gestionnaire est plus appropriée.
  • Pour plusieurs instances ou des dépendances plus complexes, envisagez de créer un type de contexte personnalisé qui peut être transmis via les gestionnaires.

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