2015-11-24 6 views
1

Пытается использовать RecoverHandler, скомпилировать его из Intellij.Go Gorilla RecoveryHandler compile error

r := mux.NewRouter() 
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
    panic("Unexpected error!") 
}) 

http.ListenAndServe(":1123", handlers.RecoveryHandler(r)) 

Я получаю ниже ошибки. Выше код из gorilla documenation as-используется, и я запустил go get github.com/gorilla/handlers.

 
src/main.go:48: cannot use r (type *mux.Router) as type handlers.RecoveryOption in argument to handlers.RecoveryHandler 
src/main.go:48: cannot use handlers.RecoveryHandler(r) (type func(http.Handler) http.Handler) as type *mux.Router in assignment 

Как использовать RecoveryHandler of Gorilla?

ответ

2

Похоже, что документация неверна. handlers.RecoveryHandler не может использоваться как промежуточное ПО-обработчик http-обработчика, он возвращает его. Глядя на подпись

func RecoveryHandler(opts ...RecoveryOption) func(h http.Handler) http.Handler 

мы можем видеть, что он принимает 0 или более handlers.RecoveryOption с и возвращает func(http.Handler) http.Handler. Эта функция, которую он возвращает, - это то, что мы действительно хотим обернуть вокруг нашего маршрутизатора. Мы можем написать это как

recoveryHandler := handlers.RecoveryHandler() 
http.ListenAndServe(":1123", recoveryHandler(r)) 

Или вы могли бы сделать все это в одной строке

http.ListenAndServe(":1123", handlers.RecoveryHandler()(r)) 
+2

Я установил пример в документации: https://github.com/gorilla/handlers/pull/55 – elithrar