2014-05-21 6 views
6

Ich verwende Go in HTTP-Server und pat gebaut ist auf einige URLs reagieren:in Parameter an eine http.HandlerFunc Passing

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

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

ich in einem zusätzlichen Parameter an diese Handler-Funktion übergeben müssen - eine Schnittstelle.

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

Wie kann ich einen zusätzlichen Parameter an die Handler-Funktion senden?

Antwort

10

Sie sollten in der Lage sein zu tun, was Sie wünschen, indem Sie Verschlüsse verwenden.

ändern func index() auf die folgende (nicht getestet):

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

Und dann das gleiche tun zu func show()

+1

Große Köpfe denken gleich! Ich lösche meine Antwort. :) – sergserg

+1

Hehe, ja, ich sah, dass du den __exact__ gleichen Code in deiner eigenen Schlussfolgerung hast. – ANisus

+1

Eine alternative Signatur: 'func index (rm interface {}) http.HandlerFunc {return func (w http.ResponseWriter, r * http.Request) {...}}' – elithrar

5

Eine weitere Option ist Typen verwenden http.Handler Umsetzung direkt und nicht nur mit Hilfe von Funktionen. Zum Beispiel:

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

Diese Art von Muster kann nützlich sein, wenn Sie Ihre ServeHTTP-Handler-Methode in mehrere Methoden Refactoring wollen.