Maison  >  Article  >  développement back-end  >  Analyse complète des intercepteurs à Golang

Analyse complète des intercepteurs à Golang

WBOY
WBOYoriginal
2024-04-07 10:18:021140parcourir

Dans Golang, les intercepteurs peuvent être utilisés pour insérer du code supplémentaire avant et après l'exécution de la fonction. Les scénarios incluent la journalisation, l'authentification, la mise en cache, etc. Les intercepteurs sont implémentés en créant un type de fonction de gestionnaire, puis en créant la fonction d'intercepteur qui accepte la fonction de gestionnaire et renvoie une nouvelle fonction de gestionnaire contenant une logique supplémentaire. En combat réel, nous pouvons utiliser des intercepteurs pour enregistrer toutes les demandes afin de faciliter le débogage et l'analyse.

全面解析 Golang 中的拦截器

Analyse complète des intercepteurs dans Golang

Introduction

Les intercepteurs sont un modèle de conception qui permet d'insérer du code supplémentaire avant et après l'exécution d'une fonction. Dans Golang, les intercepteurs peuvent être utilisés comme middleware pour ajouter une logique personnalisée pour le traitement des requêtes HTTP.

Scénarios d'utilisation

Les intercepteurs peuvent être utilisés dans divers scénarios, notamment :

  • Logging : Enregistrer les détails de la demande et de la réponse.
  • Authentification : Vérifiez si l'utilisateur est autorisé à accéder aux ressources protégées.
  • Caching : Mettre en cache les résultats des requêtes pour améliorer les performances.

Implémentation

L'implémentation d'intercepteurs dans Golang est très simple. Tout d'abord, nous devons créer un HandlerFunc 类型,它接受 ResponseWriter*Request en entrée et renvoyer une erreur :

type HandlerFunc func(rw http.ResponseWriter, r *http.Request) error

Ensuite, nous pouvons créer une fonction d'intercepteur qui accepte une fonction de gestionnaire et renvoie une nouvelle fonction de gestionnaire :

func WithLogging(next HandlerFunc) HandlerFunc {
    return func(rw http.ResponseWriter, r *http.Request) error {
        // 在处理程序执行之前插入日志记录代码
        log.Printf("Handling request: %s", r.URL.Path)
        if err := next(rw, r); err != nil {
            // 在处理程序执行之后插入日志记录代码
            log.Printf("Error handling request: %v", err)
            return err
        }
        return nil
    }
}

Cas réel

Considérons un serveur HTTP simple qui prend en charge deux routes :

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", IndexHandler)
    http.HandleFunc("/about", AboutHandler)

    // 使用拦截器记录所有请求
    http.ListenAndServe(":8080", WithLogging(http.DefaultServeMux))
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to the home page!")
}

func AboutHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "About Us: We are a software development company.")
}

Après avoir exécuté le serveur, chaque requête est enregistrée dans la console pour le débogage et l'analyse.

Conclusion

Les intercepteurs sont des outils puissants dans Golang pour améliorer l'exécution des fonctions. En utilisant les techniques décrites ci-dessus, nous pouvons facilement ajouter une logique personnalisée pour la gestion des requêtes HTTP, augmentant ainsi la flexibilité et la maintenabilité de notre application.

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