2016-12-18 3 views
-1

Ich erstelle eine Restful API.String in Funktionsname in GO konvertieren?

Ich bin vorbei Funktionsnamen und Argumente in JSON

zB. "localhost/json_server?method=foo&id=1"

Lassen Sie uns sagen, ich habe einen einfachen go Server

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {                    
    fmt.Println("path",r.URL.Path)                            
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))                     
}) 
......... 
function json_server(){ 
.... 
} 

Die r.url.Path gibt mir "json_server" in String läuft. Jetzt möchte ich zuerst überprüfen, ob die Funktion existiert, falls vorhanden, rufe die Funktion wie definiert auf, sonst gibt es eine Ausnahme.

Ist das möglich?

Wenn ich mache Python und ich verwenden, um die Methode und die Argumente, die in der Zeichenfolge sind, aufzurufen.

Ich habe Interesse an Go nach der Verwendung von Docker entwickelt. Jede Hilfe wird geschätzt.

Antwort

1

Soweit ich weiß, ist es nicht möglich, die Funktionen eines Pakets mit der reflection api zu nummerieren, aber siehe this mailing list discussion für einige Ideen zum Parsen der Quelldateien. Aufzählung Methoden eines Objekts is possible, das ist eigentlich mehr, was Sie in Python beschreiben.

Ich würde jedoch empfehlen, eine einfache Versandtabelle anstelle von Introspektion zu verwenden, können Sie eine map[string]func() auffüllen, obwohl ich vermute, dass Sie einige Argumente an Ihre Funktion übergeben möchten, z. der Antrag behandelt werden:

var dispatch map[string]http.HandlerFunc 

func init() { 
    dispatch = make(map[string]http.HandlerFunc) 
    dispatch["json_server"] = json_server 
    dispatch["foo"] = func(w http.ResponseWriter, r *http.Request) { 
     ... 
    } 
} 

func ServeHTTP (w http.ResponseWriter, r *http.Request) { 
    if handler, exists := dispatch[req.URL.Path]; exists { 
     handler(w, r) 
    } else { 
     ... // fallback 
    } 
} 

Oder noch besser, nur einen bestehenden HTTP-Router verwenden, wie httprouter oder gorilla/mux. Es gibt viele Alternativen zur Auswahl.