2016-12-18 9 views
-1

私はRestful APIを作成しています。GOの文字列を関数名に変換しますか?

JSONで関数名と引数を渡します。

例: "localhost/json_server?method=foo&id=1"

は私が私に "json_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(){ 
.... 
} 

r.url.Path実行されているシンプルな、外出先サーバーを持っている、と言うことができます。今私は最初に関数が存在するかどうかをチェックしたい場合は、定義されている関数を呼び出していくつかの例外をスローします。

これは可能ですか?

pythonと私はを使用して、文字列内のメソッドと引数を呼び出します。

私はDockerを使用した後にGoに興味を持ちました。どんな助けもありがとう。

答えて

1

私が知る限り、パッケージの機能をreflection apiで列挙することはできませんが、ソースファイルの解析に関するいくつかのアイデアについては、this mailing list discussionを参照してください。実際にはPythonで説明するものよりも多くのオブジェクトis possibleのメソッドを列挙します。

しかし、イントロスペクションの代わりに単純なディスパッチテーブルを使用することをお勧めします。map[string]func()に値を設定できます。たとえば、関数にいくつかの引数を渡すことが考えられます。

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

いっそ、ちょうどそのようなhttproutergorilla/muxとして、既存のHTTPルータを使用します。処理される要求。選択肢はたくさんあります。

関連する問題