Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Go tidak memahami cara http.Server Handler memanggil fungsi yang dilampirkan pada struct kosong

Go tidak memahami cara http.Server Handler memanggil fungsi yang dilampirkan pada struct kosong

WBOY
WBOYke hadapan
2024-02-10 16:00:11582semak imbas

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

editor php Banana ada di sini untuk menjawab soalan tentang bahasa Go: Go tidak memahami cara http.Server Handler memanggil fungsi yang dilampirkan pada struktur kosong. Dalam bahasa Go, http.Server ialah struktur yang digunakan untuk memproses permintaan HTTP, dan medan Pengendali ialah jenis antara muka. Jenis antara muka ialah jenis khas yang mentakrifkan satu set kaedah. Apabila kita menetapkan fungsi kepada medan Pengendali, bahasa Go akan menggunakan mekanisme pantulan untuk memanggil fungsi tersebut. Walau bagaimanapun, jika kita melampirkan fungsi pada struktur kosong, bahasa Go tidak akan memahami cara memanggil fungsi dengan betul. Ini kerana apabila kaedah dipanggil pada struktur kosong, contoh objek sebenar tidak boleh diperolehi. Untuk menyelesaikan masalah ini, kita boleh menggunakan penutupan atau kaedah dengan penerima.

Kandungan soalan

Saya mempunyai kod untuk pelayan web yang ringkas tetapi saya tidak faham kod ini:

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

Dalam fail laluan:

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
}

Ini adalah fungsi route() yang dipanggil apabila permintaan diterima, Tetapi bagaimana laluan() ini tahu dicetuskan apabila ia dilampirkan pada struct kosong?

app := Config{}

Di manakah aplikasi mengetahui tentang laluan()?

Apakah fungsi (app *config) dalam fungsi?

Penyelesaian

Laluan dilampirkan pada pelayan http seperti yang ditunjukkan di bawah.

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

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

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

config Struktur bertindak sebagai penerima kaedah di sini.

Atas ialah kandungan terperinci Go tidak memahami cara http.Server Handler memanggil fungsi yang dilampirkan pada struct kosong. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam