Heim  >  Artikel  >  Backend-Entwicklung  >  Go versteht nicht, wie der http.Server-Handler Funktionen aufruft, die an leere Strukturen angehängt sind

Go versteht nicht, wie der http.Server-Handler Funktionen aufruft, die an leere Strukturen angehängt sind

WBOY
WBOYnach vorne
2024-02-10 16:00:11582Durchsuche

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

php-Editor Banana ist hier, um eine Frage zur Go-Sprache zu beantworten: Go versteht nicht, wie der http.Server-Handler Funktionen aufruft, die an leere Strukturen angehängt sind. In der Go-Sprache ist http.Server eine Struktur zur Verarbeitung von HTTP-Anfragen, und das Handler-Feld ist ein Schnittstellentyp. Ein Schnittstellentyp ist ein spezieller Typ, der eine Reihe von Methoden definiert. Wenn wir dem Handler-Feld eine Funktion zuweisen, verwendet die Go-Sprache den Reflexionsmechanismus, um die Funktion aufzurufen. Wenn wir jedoch eine Funktion an eine leere Struktur anhängen, versteht die Go-Sprache nicht, wie die Funktion korrekt aufgerufen wird. Dies liegt daran, dass beim Aufruf einer Methode für eine leere Struktur die tatsächliche Objektinstanz nicht abgerufen werden kann. Um dieses Problem zu lösen, können wir Abschlüsse oder Methoden mit Empfängern verwenden.

Frageninhalt

Ich habe einen Code für einen einfachen Webserver, aber ich verstehe diesen Code nicht:

Handler: 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)
    }
}

In der Routendatei:

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
}

Dies ist im Grunde die Funktion „routes()“, die aufgerufen wird, wenn eine Anfrage eingeht. Aber woher weiß diese Route(), dass sie ausgelöst wird, wenn sie an eine leere Struktur angehängt wird?

app := Config{}

Woher weiß die Anwendung über Routen() Bescheid?

Was ist func (app *config) in der Funktion?

Workaround

Die Route wird wie unten gezeigt an den http-Server angehängt.

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

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

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

config Die Struktur fungiert hier als Methodenempfänger.

Das obige ist der detaillierte Inhalt vonGo versteht nicht, wie der http.Server-Handler Funktionen aufruft, die an leere Strukturen angehängt sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen