为了账号安全,请及时绑定邮箱和手机立即绑定

运行时访问 Go 中的符号

运行时访问 Go 中的符号

Go
慕丝7291255 2022-04-20 17:43:52
在用 Go 编写 Web 服务器时,我希望能够在运行时取消引用符号,以使我能够确定从配置文件中调用哪些函数,例如调用示例中虚构的“eval”函数以下。这将允许我从处理程序库中选择处理程序,并仅使用配置文件部署新服务器。有什么方法可以在 Go 中实现这一点吗?配置文件{ "url": "/api/apple", "handler": "Apple", "method": "get" }{ "url": "/api/banana", "handler": "Banana", "method": "get" }play.gopackage mainimport (    "github.com/gorilla/mux"    "net/http"    "encoding/json"    "log")type ConfigEntry struct {    URL string `json:"url"`    Method string `json:"method"`    Handler string `json:"handler"`}func main() {    ifp, err := os.Open("config.json")    if err != nil {        log.Fatal(err)    }    dec := json.NewDecoder(ifp)    r := mux.NewRouter()    for {        var config ConfigEntry        if err = dec.Decode(&m); err == io.EOF {            break        } else if err != nil {            log.Fatal(err)        }        r.HandleFunc(config.URL, eval(config.Handler + "Handler")).Methods(config.Method)    }    http.Handle("/", r)    http.ListenAndServe(8080, nil)}func AppleHandler(w http.ResponseWriter, r *http.Request) (status int, err error) {    w.Write("Apples!\n")    return http.StatusOK, nil}func BananaHandler(w http.ResponseWriter, r *http.Request) (status int, err error) {    w.Write("Bananas!\n")    return http.StatusOK, nil}
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

Go 中没有像 eval 这样的东西,这是一件好事,因为这样的事情非常危险。


您可以做的是将配置文件中的处理程序字符串映射到代码中的处理程序函数的映射:


var handlers = map[string]func(http.ResponseWriter, *http.Request) (int, error){

        "Apple": AppleHandler,

        "Banana": BananaHandler,

}

然后,您只需执行以下操作即可注册这些处理程序:


handler, ok := handlers[config.Handler]

if !ok {

        log.Fatal(fmt.Errorf("Handler not found"))

}

r.HandleFunc(config.URL, handler).Methods(config.Method)


查看完整回答
反对 回复 2022-04-20
?
大话西游666

TA贡献1817条经验 获得超14个赞

reflect在运行时使用包访问事物有一些有限的方法。但是,它不允许您搜索包中所有合适的独立功能。如果它们都是已知结构类型/值的方法,那将是可能的。

作为您给定示例的替代方案,您可以简单地使用 amap[string]func(...)来存储所有处理程序,在启动时(在 期间init())初始化它并从那里获取处理程序。但这或多或少也是现有的 http 多路复用器正在做的事情。


查看完整回答
反对 回复 2022-04-20
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号