Как работает интерфейс http.Handler

Начал разбираться с middlewares и появился вопрос.

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    mux := http.NewServeMux()//здесь у mux нет явного метода
                       //ServeHTTP(ResponseWriter, *Request)
    mux.HandleFunc("/test", test)
    mdlwr := MdlWr(mux) //однако здесь не ругается что объект mux не реализует интерфейс.
    http.ListenAndServe(":8181", mdlwr)
}
//функция принимает объект интерфейсного типа Handler 
//и чтобы удовлетворить интерфейсу Handler, объект должен
//обладать методом `ServeHTTP(ResponseWriter, *Request)`
//но в main объект mux, который помещаю в Mdlwr 
//не имеет такого метода явно. А как Mdlwr тогда работает?
func MdlWr(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println(r.RequestURI)
        h.ServeHTTP(w, r)
    })
}
func test(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "ok")
}

Вопрос в комментах к коду Спасибо за ваше время, внимание и, в идеале, ответ.


Ответы (0 шт):