首頁  >  文章  >  後端開發  >  Go 不理解 http.Server Handler 如何呼叫附加到空結構的函數

Go 不理解 http.Server Handler 如何呼叫附加到空結構的函數

WBOY
WBOY轉載
2024-02-10 16:00:11612瀏覽

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

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
 }

routesconfig 結構體的一個方法。即使 config 為空,我們仍然可以像程式碼中那樣呼叫 routes 方法。

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

config 結構在這裡充當方法接收器。

以上是Go 不理解 http.Server Handler 如何呼叫附加到空結構的函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除