I'm using Go's built in http server and pat to respond to some URLs:
mux.Get("/products", http.HandlerFunc(index))
func index(w http.ResponseWriter, r *http.Request) {
// Do something.
}
I need to pass in an extra parameter to this handler function - an interface.
func (api Api) Attach(resourceManager interface{}, route string) {
// Apply typical REST actions to Mux.
// ie: Product - to /products
mux.Get(route, http.HandlerFunc(index(resourceManager)))
// ie: Product ID: 1 - to /products/1
mux.Get(route+"/:id", http.HandlerFunc(show(resourceManager)))
}
func index(w http.ResponseWriter, r *http.Request, resourceManager interface{}) {
managerType := string(reflect.TypeOf(resourceManager).String())
w.Write([]byte(fmt.Sprintf("%v", managerType)))
}
func show(w http.ResponseWriter, r *http.Request, resourceManager interface{}) {
managerType := string(reflect.TypeOf(resourceManager).String())
w.Write([]byte(fmt.Sprintf("%v", managerType)))
}
How can I send in an extra paramter to the handler function?
Another option is to use types implementing
http.Handler
directly rather than only using functions. For example:This kind of pattern can be useful if you want to refactor your
ServeHTTP
handler method into multiple methods.You should be able to do what you wish by using closures.
Change
func index()
to the following (untested):And then do the same to
func show()