2015-01-11 3 views
0

Я строю простой маршрутизатор, для которого код ниже.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) 
    } 
} 

Закомментированный из кода описывает этот вопрос им с /, что им пытаются сделать

+1

Не отображается для решения этого конкретного вопроса, но могут быть полезны: http://stackoverflow.com/a/19334952/3794472 –

ответ

3

Ведение

type Res response.Response 

вы определяете новый тип, который не взаимозаменяем с оригинальным

к конвертировать, вы должны сделать

newResponse := Res(response.NewResponse(w)) 

когда вы

type Res http.ResponseWriter 

ваш тип Res является интерфейсом и http.ResponseWriter его реализации, поэтому может быть использован в качестве аргумента в FUNC где Res хотел

Смежные вопросы