为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 类型别名(类型 SampleType otherType !== otherType)

Golang 类型别名(类型 SampleType otherType !== otherType)

Go
心有法竹 2021-09-10 18:13:42
我正在构建一个简单的路由器,其代码如下。我有一个将 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 Routerimport (    "fmt"    "net/http"    "net/url"    "log"    // "./response")// type Res response.Responsetype Res http.ResponseWritertype Req *http.Requesttype RouteMap map[string]func(Res, Req) type MethodMap map[string]RouteMaptype 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 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

正在做

type Res response.Response

您定义新类型,不能与原始类型互换

转换你应该做的

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

当你做

type Res http.ResponseWriter

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


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信