3 回答

TA貢獻1900條經驗 獲得超5個贊
您可以使用http.DefaultServeMux(輸入ServeMux)并檢查它。使用reflect包,您可以ValueOf使用默認的多路復用器和提取m屬性,這是您的路線圖。
v := reflect.ValueOf(http.DefaultServeMux).Elem()
fmt.Printf("routes: %v\n", v.FieldByName("m"))
更新:
如果您使用net/http比您應該在您自己實際完成任何請求之前實現提取參數;否則你可以訪問參數r.URL.Query()
如果您使用的gorilla/mux不是elithrar提到的,您應該使用Walk:
功能主要:
r := mux.NewRouter()
r.HandleFunc("/path/{param1}", handler)
err := r.Walk(gorillaWalkFn)
if err != nil {
log.Fatal(err)
}
功能 gorillaWalkFn:
func gorillaWalkFn(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
path, err := route.GetPathTemplate()
return nil
}
該path變量包含您的模板:
“/路徑/{param1}”
但您應該手動提取參數。

TA貢獻1788條經驗 獲得超4個贊
您可以看到 HTTP 包中的路由列表。
http.HandleFunc("/favicon.ico", func(res http.ResponseWriter, req *http.Request) {
http.ServeFile(res, req, "favicon.ico")
})
http.HandleFunc(`/check`, func(res http.ResponseWriter, req *http.Request) {
res.Write([]byte("Regexp works :)"))
})
httpMux := reflect.ValueOf(http.DefaultServeMux).Elem()
finList := httpMux.FieldByIndex([]int{1})
fmt.Println(finList)

TA貢獻1847條經驗 獲得超7個贊
我想一個改進的答案。
它提供了缺失的一段代碼來從路由路徑模板字符串中提取參數。
var pathTemplateRegex = regexp.MustCompile(`\{(\\?[^}])+\}`)
func getRouteParams(router *mux.Router, route string) []string {
r := router.Get(route)
if r == nil {
return nil
}
t, _ := r.GetPathTemplate()
params := pathTemplateRegex.FindAllString(t, -1)
for i, p := range params {
p = strings.TrimPrefix(p, "{")
p = strings.TrimSuffix(p, "}")
if strings.ContainsAny(p, ":") {
p = strings.Split(p, ":")[0]
}
params[i] = p
}
return params
}
- 3 回答
- 0 關注
- 214 瀏覽
添加回答
舉報