http.HandlerFunc представляет собой тип, представляющий func(ResponseWriter, *Request)
.
Разница между http.HandlerFunc
и func(ResponseWriter, *Request)
состоит в следующем: * тип 1008 * имеет метод, называемый ServeHTTP()
.
Из исходного кода :
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
http.HandlerFunc()
может использоваться для переноса функции обработчика.
func Something(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// do something
next.ServeHTTP(w, r)
})
}
Обернутый обработчик будет иметь тип http.HandlerFunc()
, то есть мы сможем получить к нему доступ .ServeHTTP()
method.
Существует также другой тип, интерфейс с именем http.Handler .Он имеет .ServeHTTP()
сигнатуру метода и должен быть реализован в структуре, в которую встроен интерфейс.
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Как видно из функции Something()
, возвращаемое значение в http.Handler
тип обязателен, но мы вернули обработчик, завернутый в http.HandlerFunc()
.Это нормально, потому что http.HandlerFunc
имеет метод .ServeHTTP()
, который удовлетворяет требованию интерфейса http.Handler
.
Другими словами, почему я звоню h.ServeHTTP(w,r)
вместо h(w,r)
?
Поскольку для продолжения обслуживания входящего запроса необходимо позвонить .ServeHTTP()
.