Golang 类型别名(类型 SampleType otherType !== otherType)?
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
- 响应是我自己的包(请看什么是在下面的来源中注释掉)。这样做之后我得到 "Cannot use newResponse (type response.Response) as type Res in argument to urlCallback"
我查看了 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)
}
}
注释掉的代码描述了我having/what我正在尝试做的问题
正在做
type Res response.Response
您定义了新类型,它不能与原始类型互换
转换你应该做的
newResponse := Res(response.NewResponse(w))
当你这样做时
type Res http.ResponseWriter
您的类型 Res 是一个接口并且 http.ResponseWriter 实现了它,因此可以在需要 Res 的 func 中用作参数
我正在构建一个简单的路由器,其代码如下。
我有一个将 Res 类型作为参数的回调。最初我的印象是 type Res http.ResponseWriter
只是意味着 Res 是 http.ResponseWriter 的别名,因为将 http.ResponseWriter 传递到带有 Res 参数的回调中工作正常。
我后来决定我想围绕提供给回调的响应包装我自己的功能,因此将 type Res http.ResponseWriter
更改为 type Res response.Response
- 响应是我自己的包(请看什么是在下面的来源中注释掉)。这样做之后我得到 "Cannot use newResponse (type response.Response) as type Res in argument to urlCallback"
我查看了 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)
}
}
注释掉的代码描述了我having/what我正在尝试做的问题
正在做
type Res response.Response
您定义了新类型,它不能与原始类型互换
转换你应该做的
newResponse := Res(response.NewResponse(w))
当你这样做时
type Res http.ResponseWriter
您的类型 Res 是一个接口并且 http.ResponseWriter 实现了它,因此可以在需要 Res 的 func 中用作参数