我正在构建一个简单的路由器,其代码如下。


我有一个将 Res 类型作为参数的回调。最初我的印象type Res http.ResponseWriter是,Res 是 http.ResponseWriter 的别名,因为将 http.ResponseWriter 传递到带有 Res 参数的回调中效果很好。


后来我决定我想围绕提供给回调的响应包装我自己的功能,因此将type Res http.ResponseWriterto type Res response.Response- response更改为我自己的包(请查看下面源代码中注释掉的内容)。这样做后,我得到“无法使用 newResponse(类型 response.Response)作为 urlCallback 参数中的类型 Res”


我查看了 http.ResponseWriter 源代码并注意到它是一个接口,而我的 response.Response 是一个结构体,这是问题所在吗?


将类型设置为另一种类型不一定是它的别名吗?如果不是,那么为什么最初传入 Res 类型的 http.ResponseWriter 有效?


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)

    }

}

注释掉的代码描述了我遇到的问题/我想做什么