I am trying to build a simple router in GO, I have a get method on a struct that should be passing a callback to the Get route map with the url as the key, it seems that fmt.Println(urlCallback)
is returning a nil value and causes a runtime panic if i tried to call it, coming from a javascript background I am only just coming to grips with pointers and the like and feel it may have something to do with this,if someone could tell me why the passed func is nil that would be great.
Here is my "Router" package.
package Router
import (
"fmt"
"net/http"
"net/url"
"log"
)
type Res http.ResponseWriter
type Req *http.Request
type RouteMap map[*url.URL]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)
}
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
}
and my main.
package main
import (
"./router"
"fmt"
)
func main() {
router := Router.NewRouter()
router.Get("/test", func(Router.Res, Router.Req) {
fmt.Println("In test woohooo!")
})
router.Serve("localhost", "8888")
}