我使用Go内置的http服务器和pat来回复一些网址:
mux.Get("/products", http.HandlerFunc(index))
func index(w http.ResponseWriter, r *http.Request) {
// Do something.
}
我需要将一个额外的参数传递给这个处理函数 - 一个接口。
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)))
}
如何向处理程序函数发送额外的参数?
答案 0 :(得分:12)
你应该能够通过使用闭包来做你想做的事。
将func index()
更改为以下(未经测试):
func index(resourceManager interface{}) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
managerType := string(reflect.TypeOf(resourceManager).String())
w.Write([]byte(fmt.Sprintf("%v", managerType)))
}
}
然后对func show()
答案 1 :(得分:7)
另一个选择是直接使用实现http.Handler
的类型而不是仅使用函数。例如:
type IndexHandler struct {
resourceManager interface{}
}
func (ih IndexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
managerType := string(reflect.TypeOf(ih.resourceManager).String())
w.Write([]byte(fmt.Sprintf("%v", managerType)))
}
...
mux.Get(route, IndexHandler{resourceManager})
如果您想将ServeHTTP
处理程序方法重构为多种方法,则此类模式非常有用。