У меня есть следующая программа Go, которая представляет собой статический файловый сервер. Я получаю следующую ошибку в консоли:
..\static\main.go:45:5: cannot use handlers.CombinedLoggingHandler(os.Stdout, r) (type http.Handler) as type *mux.Router in assignment: need type assertion
..\static\main.go:52:5: cannot use handlers.CompressHandler(l) (type http.Handler) as type *mux.Router in assignment: need type assertion
Как я могу использовать флаги с маршрутизатором Gorilla Mux и CombinedLoggingHandler
или CompressHandler
?
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
controllers "<this_is_a_local_repo>"
common "<this_is_a_local_repo>"
)
var (
host = flag.String("host", "127.0.0.1", "TCP host to listen to")
port = flag.String("port", "8081", "TCP port to listen to")
logging = flag.Bool("logging", false, "Whether to enable HTTP response logging")
compress = flag.Bool("compress", true, "Whether to enable transparent response compression")
dir = flag.String("dir", common.Abs("public"), "Directory to serve static files from")
)
func main() {
flag.Parse()
r := mux.NewRouter().StrictSlash(true)
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(*dir))))
r.PathPrefix("/").HandlerFunc(controllers.IndexHandler(*dir + "/index.html")) // catch-all route for 404
l := r
if *logging {
l = handlers.CombinedLoggingHandler(os.Stdout, r)
}
h := l
if *compress {
h = handlers.CompressHandler(l) // gzip all responses
}
srv := &http.Server{
Handler: h,
Addr: fmt.Sprintf("%s:%s", *host, *port),
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
var h http.Handler = r
, если... тоh = handlers.CombinedLoggingHandler(os.Stdout, h)
, если... тоh = handlers.CompressHandler(h)
. Нет необходимости делатьl := r
иh := l
, достаточно сделатьh = middleware(h)
. - person mkopriva   schedule 17.03.2018CombinedLoggingHandler
иCompressHandler
. Они оба требуют типа обработчика, что здесь не так. - person Himanshu   schedule 17.03.2018http.Handler
в качестве аргумента, код в порядке, поскольку*mux.Router
реализует этот интерфейс. Проблема в том, что они также возвращаютhttp.Handler
, но тип значения в левой части присваивания —*mux.Router
, а неhttp.Handler
... Проблема в том, какого типа эти две функции return, а не в том, что они требуют в качестве аргумента. - person mkopriva   schedule 17.03.2018http.Handler
— это функция, использующаяservemux
в качестве получателя. Вы объявили переменную этого типа. Хэндер - это тип? Я никогда не видел объявления переменной функционального типа. Пожалуйста, дополните. я в стадии обучения - person Himanshu   schedule 17.03.2018r
относится к типу*mux.Router
, этот тип уже реализует интерфейсhttp.Handler
. Итак,var h http.Handler = r
объявляет переменнуюh
типаhttp.Handler
и присваивает ей значениеr
, что правильно и будет компилироваться, потому чтоr
(*mux.Router) имеет методServeHTTP
, необходимый для реализации интерфейса. - person mkopriva   schedule 17.03.2018