Golang标准库http.ServeMux及如何获取所有已注册路径
Golang标准库http.ServeMux及如何获取所有已注册路径 有人能帮忙获取所有已注册的路径吗?例如:
mux.Handler("/some/path", callSomeFunc())
有什么建议吗?
我是认真的,不过本质上它们是相同的概念。只是你的描述更偏向基于OOP类的表述,而我的用的是Go语言的术语。
更多关于Golang标准库http.ServeMux及如何获取所有已注册路径的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
CurtGreen:
我不确定你这样做的使用场景是什么
你好!感谢回复。 “我不确定你这样做的使用场景是什么” - 只是想要渲染一个"系统页面",在那里我可以看到应用程序的所有可用路由。
“ServeMux 将你的处理程序注册到未导出的字段” - 你是指私有属性吗?
ServeMux 将您的处理器注册到未导出的字段中,因此您无法直接检索它们。也没有针对此行为的方法函数。我不确定您对此的使用场景是什么,但您可以临时凑合使用一些方法来测试 ServeMux.Handler() 函数的一系列可能路径。除非您知道自己在寻找什么,否则这将完全不可靠,因此路径发现并不是真正的解决方案。
我很好奇您是否正在尝试实现服务架构,并试图从服务器获取服务发现行为。如果是这样,这是错误的路径。
在Go语言的标准库net/http中,http.ServeMux类型内部维护了一个已注册路径的映射,但这些路径并未直接公开为公共API。不过,可以通过反射来访问其内部结构以获取所有已注册路径。以下是一个示例代码,展示如何实现这一点:
package main
import (
"fmt"
"net/http"
"reflect"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/some/path", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "处理路径 /some/path")
})
mux.HandleFunc("/another/path", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "处理路径 /another/path")
})
// 使用反射访问 ServeMux 的私有字段 m
v := reflect.ValueOf(mux).Elem()
mField := v.FieldByName("m")
if mField.IsValid() && mField.Kind() == reflect.Map {
keys := mField.MapKeys()
fmt.Println("已注册的路径:")
for _, key := range keys {
fmt.Println(key.String())
}
} else {
fmt.Println("无法访问 ServeMux 的路径映射")
}
}
运行此代码将输出:
已注册的路径:
/some/path
/another/path
注意:这种方法依赖于http.ServeMux的内部结构(具体是字段m),该结构在Go标准库中可能随版本更新而改变。因此,在生产环境中使用反射时需谨慎,并确保测试兼容性。如果只是用于调试或开发目的,这是一个有效的解决方案。

