将字符串转换为GO中的函数名称?

时间:2016-12-18 07:37:22

标签: go

我正在创建一个Restful API。

我在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 时,我使用getattr(method,args)来调用字符串中的方法和参数。

使用Docker后,我对Go产生了兴趣。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

据我所知,使用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路由器,例如httproutergorilla/mux。有很多选择可供选择。