php小編香蕉在這裡為大家解答一個關於Go語言中的問題:Go不理解http.Server Handler如何呼叫附加到空結構的函數。在Go語言中,http.Server是一個用來處理HTTP請求的結構體,其中的Handler欄位是一個介面類型。介面類型是一種特殊的類型,它定義了一組方法的集合。當我們將一個函數賦值給Handler欄位時,Go語言會使用反射機制來呼叫這個函數。但是,如果我們將一個函數附加到一個空結構體上,Go語言會無法理解如何正確地呼叫這個函數。這是因為在空結構體上呼叫方法時,無法取得到實際的物件實例。要解決這個問題,我們可以使用閉包或使用有接收者的方法來處理。
我有一個簡單的網頁伺服器的程式碼,但我不明白這段程式碼:
處理程序: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) } }
在路由檔案中:
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 }
這是有效的,當收到請求時呼叫的routes()函數, 但是這個routes()如何知道當它附加到一個空結構時被觸發呢?
app := Config{}
應用程式從哪裡知道routes()?
函數中的 func (app *config)
是什麼?
路由已附加到 http 伺服器,如下所示。
srv := &http.server{ addr: ":8081", // port handler: app.routes() // a handler to invoke }
routes
是 config
結構體的一個方法。即使 config
為空,我們仍然可以像程式碼中那樣呼叫 routes
方法。
cfg := Config{} r := cfg.routes()
config
結構在這裡充當方法接收器。
以上是Go 不理解 http.Server Handler 如何呼叫附加到空結構的函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!