Maison  >  Article  >  développement back-end  >  Go ne comprend pas comment http.Server Handler appelle les fonctions attachées à des structures vides

Go ne comprend pas comment http.Server Handler appelle les fonctions attachées à des structures vides

WBOY
WBOYavant
2024-02-10 16:00:11582parcourir

Go 不理解 http.Server Handler 如何调用附加到空结构的函数

l'éditeur php Banana est là pour répondre à une question sur le langage Go : Go ne comprend pas comment http.Server Handler appelle les fonctions attachées à des structures vides. Dans le langage Go, http.Server est une structure utilisée pour traiter les requêtes HTTP, et le champ Handler est un type d'interface. Un type d'interface est un type spécial qui définit un ensemble de méthodes. Lorsque nous attribuons une fonction au champ Handler, le langage Go utilisera le mécanisme de réflexion pour appeler la fonction. Cependant, si l’on attache une fonction à une structure vide, le langage Go ne comprendra pas comment appeler correctement la fonction. En effet, lorsqu'une méthode est appelée sur une structure vide, l'instance réelle de l'objet ne peut pas être obtenue. Pour résoudre ce problème, nous pouvons utiliser des fermetures ou des méthodes avec des récepteurs.

Contenu de la question

J'ai un code pour un serveur web simple mais je ne comprends pas ce code :

Gestionnaire : app.routes(),

const webport = "80"

type config struct {}

func main() {

    app := config{}
    log.printf("starting broker service on port %s\n",webport)
    srv := &http.server{
        addr: fmt.sprintf(":%s",webport),
        handler:app.routes(),
    }

    err := srv.listenandserve()
    if(err != nil) {
        log.panic(err)
    }
}

Dans le fichier itinéraire :

func (app *config) routes() http.handler {
    mux := chi.newrouter()
    mux.use(cors.handler(cors.options{
        allowedorigins: []string{"http://*","https://*"},
        allowedmethods: []string{"get", "post", "delete","put","options"},
        allowedheaders: []string{"accept","authorization","content-type","x-csrf-token"},
        exposedheaders: []string{"link"},
        allowcredentials:true,
        maxage:300,
    }))

    mux.use(middleware.heartbeat("/ping"))
    mux.post("/",app.broker)

    return mux
}

Il s'agit en fait de la fonction routes() appelée lorsqu'une requête est reçue, Mais comment ce routes() sait-il qu'il est déclenché lorsqu'il est attaché à une structure vide ?

app := Config{}

Où l'application connaît-elle les itinéraires () ?

Qu'est-ce que func (app *config) en fonction ?

Solution

La route est attachée au serveur http comme indiqué ci-dessous.

srv := &http.server{
   addr: ":8081", // port
   handler: app.routes() // a handler to invoke
 }

routesconfig 结构体的一个方法。即使 config 为空,我们仍然可以像代码中那样调用 routes Méthode.

 cfg := Config{}
 r := cfg.routes()

config La structure agit ici comme un récepteur de méthode.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer