运行时访问 Go 中的符号

在用 Go 编写 Web 服务器时,我希望能够在运行时取消引用符号,以使我能够确定从配置文件中调用哪些函数,例如调用示例中虚构的“eval”函数以下。这将允许我从处理程序库中选择处理程序,并仅使用配置文件部署新服务器。有什么方法可以在 Go 中实现这一点吗?


配置文件


{ "url": "/api/apple", "handler": "Apple", "method": "get" }

{ "url": "/api/banana", "handler": "Banana", "method": "get" }

play.go


package main


import (

    "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

}


慕丝7291255
浏览 148回答 2
2回答

FFIVE

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)

大话西游666

reflect在运行时使用包访问事物有一些有限的方法。但是,它不允许您搜索包中所有合适的独立功能。如果它们都是已知结构类型/值的方法,那将是可能的。作为您给定示例的替代方案,您可以简单地使用 amap[string]func(...)来存储所有处理程序,在启动时(在 期间init())初始化它并从那里获取处理程序。但这或多或少也是现有的 http 多路复用器正在做的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go