我正在构建一个简单的路由器,其代码如下。
我有一个回调,它将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想要