Подтвердить что ты не робот

Разница между http.Handle и http.HandleFunc?

Документы Go имеют следующий пример для пакета http:

http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

Мне сложно понять разницу между Handle и HandleFunc и почему нужны два. Может кто-нибудь попытаться объяснить новому Гоферу ясными словами?

4b9b3361

Ответ 1

В принципе, HTTP-сервер "mux" имеет карту интерфейса path → handler

Интерфейсы используются здесь, я предполагаю, чтобы позволить вам реализовать сложные обработчики путей, которые имеют состояние.

Например, файловый сервер из стандартного пакета представляет собой структуру, содержащую корневой каталог для файловой службы и реализующий интерфейс обработчика.

который сказал, что для простых вещей func проще и понятнее. Поэтому они добавили специальный генератор, чтобы вы могли легко перейти в func.

Взгляните на: server.go

из строки: 1216 (на сегодняшний день)

  1216  type HandlerFunc func(ResponseWriter, *Request)
  1217  
  1218  // ServeHTTP calls f(w, r).
  1219  func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  1220      f(w, r)
  1221  }

То, что они делают, это реализовать интерфейс на настраиваемом типе (который соответствует совпадению api интерфейса), который просто вызывает себя.

Ответ 2

Нет, это не так. Позвольте изучить

func Handle(pattern string, handler Handler) {
    DefaultServeMux.Handle(pattern, handler) 
}

handle ожидает, что мы передадим Handler. Handler - это интерфейс

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

если какой-либо type реализует ServeHTTP(ResponseWriter, *Request) например: myCustomHandler тогда мы можем передать его как Handle(pattern string, myCustomHandler).

Во втором сценарии:

HandleFunc(pattern string, func(w ResponseWriter, r *Request) {
    // do some stuff
}

HandleFunc ожидает функцию, где Handle ожидает интерфейс Handler.

Итак, если вы просто хотите передать функцию, вы можете использовать http.HandleFunc(..). Например, @David показал, что за кулисами он реализует интерфейс Handler, вызывая ServeHTTP.

type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}