我正在嘗試在 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)
}
這會在嘗試調用它之前添加一個檢查以查看該鍵是否存在。
- 1 回答
- 0 關注
- 190 瀏覽
添加回答
舉報
0/150
提交
取消