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.
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?
Laluan dilampirkan pada pelayan http seperti yang ditunjukkan di bawah.
srv := &http.server{ addr: ":8081", // port handler: app.routes() // a handler to invoke }
routes
是 config
结构体的一个方法。即使 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!