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

我有一个回调,它将Res类型作为参数。最初我的印象是type Res http.ResponseWriter只是意味着Res是http.ResponseWriter的别名,因为将http.ResponseWriter传递给回调并且Res param运行正常。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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)
    }
}

注释掉的代码描述了我正在尝试做的事情

  • 似乎没有解决这个特定的问题,但可能会有所帮助:stackoverflow.com/a/19334952/3794472

1
type Res response.Response

你定义了新的类型,它不能与原始类型互换

转换你应该做的

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

当你这样做

1
type Res http.ResponseWriter

你的类型Res是一个接口,http.ResponseWriter实现它,因此可以在func中用作arg,其中Res想要