2016-12-18 2 views
-1

Я создаю Restful API.Преобразовать строку в название функции в GO?

Я передаю имя и аргументы функции в формате JSON

например. "localhost/json_server?method=foo&id=1"

Позволяет сказать, у меня есть простой сервер побежит

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 даст мне "json_server" в строку. Теперь я хочу сначала проверить, существует ли функция, если существует вызов функции, как определено, иначе выведите какое-то исключение.

Это можно сделать?

Когда я делаю python, и я использую для вызова метода и аргументов, которые находятся в строке.

У меня появился интерес к Go после использования Docker. Любая помощь будет оценена по достоинству.

ответ

1

Насколько я знаю, невозможно перечислять функции пакета с использованием reflection api, но см. this mailing list discussion для некоторых идей, связанных с разбором исходных файлов. Перечисление методов объекта is possible, что на самом деле больше того, что вы описываете в python.

Однако я бы рекомендовал вместо простой проверки использовать таблицу диспетчеризации, вы можете заполнить 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 
    } 
} 

Или еще лучше, просто использовать существующий HTTP маршрутизатор, такие как httprouter или gorilla/mux. Есть много альтернатив на выбор.