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

地图中的函数是 <nil>

地图中的函数是 <nil>

Go
哈士奇WWW 2021-09-10 18:08:51
我正在尝试在 Go 中构建一个简单的路由器,我在结构上有一个 get 方法,该方法应该将回调传递给以 url 为键的 Get 路由映射,它似乎fmt.Println(urlCallback)返回 nil 值并导致运行时恐慌如果我试图调用它,来自 javascript 背景,我只是开始掌握指针之类的东西,并且觉得它可能与此有关,如果有人能告诉我为什么传递的 func 为零,那就太好了.这是我的“路由器”包。package Routerimport (    "fmt"    "net/http"    "net/url"    "log")type Res http.ResponseWritertype Req *http.Requesttype RouteMap map[*url.URL]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)    }    fmt.Println(parsedUrl)    router.Methods["GET"][parsedUrl] = callback}func (router *Router) initMaps() {    router.Methods = MethodMap{}    router.Methods["GET"] = RouteMap{}}func (router Router) determineHandler(res http.ResponseWriter, req *http.Request) {    fmt.Println(req.URL)    fmt.Println(req.Method)    methodMap := router.Methods[req.Method]    urlCallback := methodMap[req.URL]    fmt.Println(methodMap)    fmt.Println(urlCallback)}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)    }}func NewRouter() Router {    newRouter := Router{}    newRouter.initMaps()    return newRouter}和我的主要。package mainimport (    "./router"    "fmt")func main() {    router := Router.NewRouter()    router.Get("/test", func(Router.Res, Router.Req) {        fmt.Println("In test woohooo!")    })    router.Serve("localhost", "8888")}
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

您正在使用*URL.url对象作为映射键。由于两个不同的对象不会相同,因此您无法再次访问该路径的密钥。很恐慌,因为


urlCallback := methodMap[req.URL]

不是现有的键,因此您访问的是 nil 值。在这种情况下,您可能想要做的是使用对象的Path属性URL.url。


所以你会有:


type RouteMap map[string]func(Res, Req)

在Get():


router.Methods["GET"][parsedUrl.Path] = callback

对于determineRouter(),您可以这样做:


urlCallback, exists := methodMap[req.URL.Path]

if exists != false {

    urlCallback(res, req)

}

这会在尝试调用它之前添加一个检查以查看该键是否存在。


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

添加回答

举报

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