亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

運行時訪問 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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號