2014-05-21 13 views
6

używam Go wbudowany serwer HTTP i pat odpowiedzieć na niektórych adresów URL:Przekazywanie parametrów do http.HandlerFunc

mux.Get("/products", http.HandlerFunc(index)) 

func index(w http.ResponseWriter, r *http.Request) { 
    // Do something. 
} 

muszę przechodzić w dodatkowy parametr do tej funkcji obsługi - interfejs.

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))) 
} 

Jak mogę wysłać na dodatkowym paramter do funkcji obsługi?

Odpowiedz

10

Powinieneś być w stanie robić, co chcesz, używając zamknięć.

Zmień func index() do następujących (niesprawdzone):

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))) 
    } 
} 

A potem zrobić to samo func show()

+1

Wielkie umysły myślą podobnie! Usuwam moją odpowiedź. :) – sergserg

+1

Hehe, tak, widziałem, że masz __exact__ sam kod w swoim własnym wniosku. – ANisus

+1

Alternatywny podpis: 'indeks func (interfejs rm {}) http.HandlerFunc {return func (w http.ResponseWriter, r * http.Request) {...}}' – elithrar

5

Inną opcją jest użycie typów wykonawczych http.Handler bezpośrednio raczej niż tylko z użyciem funkcji. Na przykład:

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}) 

Taki wzór może być przydatny, jeśli chcesz byłaby metodę ServeHTTP uchwytu na wiele sposobów.

Powiązane problemy