Я строю простой маршрутизатор, для которого код ниже.Golang type aliasing (type SampleType otherType! == otherType)?
У меня есть обратный вызов, который принимает параметр Res в качестве параметра. Первоначально у меня создалось впечатление, что type Res http.ResponseWriter
просто означает, что Res является псевдонимом для http.ResponseWriter, поскольку передача http.ResponseWriter в обратный вызов с параметром Res работала нормально.
Позже я решил обернуть свою собственную функциональность вокруг ответа, предоставленного обратному вызову, и поэтому изменил type Res http.ResponseWriter
на type Res response.Response
- ответ был моим собственным пакетом (пожалуйста, посмотрите, что закомментировано в источнике ниже). После этого я получаю «Невозможно использовать newResponse (тип response.Response) в качестве типа Res в аргументе urlCallback»
Я смотрел на исходный код http.ResponseWriter и заметил это интерфейс, тогда как мой response.Response является структура, это где проблема?
Устанавливает ли тип другого типа не обязательно его псевдоним? А если нет, то зачем сначала переходить в http.ResponseWriter для типа Res?
package Router
import (
"fmt"
"net/http"
"net/url"
"log"
// "./response"
)
// type Res response.Response
type Res http.ResponseWriter
type Req *http.Request
type RouteMap map[string]func(Res, Req)
type MethodMap map[string]RouteMap
type Router struct {
Methods MethodMap
}
func (router *Router) Get(urlString string, callback func(Res, Req)) {
parsedUrl, err := url.Parse(urlString)
if(err != nil) {
panic(err)
}
router.Methods["GET"][parsedUrl.Path] = callback
}
func (router *Router) initMaps() {
router.Methods = MethodMap{}
router.Methods["GET"] = RouteMap{}
}
func (router Router) determineHandler(w http.ResponseWriter, r *http.Request) {
methodMap := router.Methods[r.Method]
urlCallback := methodMap[r.URL.Path]
// newResponse := response.NewResponse(w)
if(urlCallback != nil) {
// urlCallback(newResponse, r)
urlCallback(w, r)
}
}
func (router Router) Serve(host string, port string) {
fullHost := host + ":" + port
fmt.Println("Router is now serving to:" + fullHost)
http.HandleFunc("/", router.determineHandler)
err := http.ListenAndServe(fullHost, nil)
if err == nil {
fmt.Println("Router is now serving to:" + fullHost)
} else {
fmt.Println("An error occurred")
log.Fatal(err)
}
}
Закомментированный из кода описывает этот вопрос им с /, что им пытаются сделать
Не отображается для решения этого конкретного вопроса, но могут быть полезны: http://stackoverflow.com/a/19334952/3794472 –