Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-10 16:00:11
nach vorne
620 Leute haben es durchsucht

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)
    }
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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{}
Nach dem Login kopieren

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
 }

Nach dem Login kopieren

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

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

Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage