SeverMux 类型本身就是一个 http.Handler,因此您可以轻松地嵌套它们。例如:
mux := NewServeMux()
mux.AddHandler("server1.com:8080/", muxA)
mux.AddHandler("server2.com:8080/", muxB)
我不太确定“组合”它们的确切含义。如果您想先尝试一个处理程序,然后在 404 的情况下尝试另一个处理程序,您可以这样做(未经测试):
mux := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rec := httptest.NewRecorder()
rec.Body = &bytes.Buffer{}
muxA.ServeHTTP(rec, r)
if rec.Code == 404 {
muxB.ServeHTTP(w, r)
return
}
for key, val := range rec.HeaderMap {
w.Header().Set(key, val)
}
w.WriteHeader(rec.Code)
rec.Body.WriteTo(w)
})
这显然有一些缺点,例如将整个响应存储在内存中。或者,如果您不介意调用您的处理程序两次,您也可以设置rec.Body = nil
、检查并在成功的情况下再次rec.Code
调用。muxA.ServeHTTP(w, r)
但最好重组您的应用程序,以便第一种方法(嵌套的 ServerMux)就足够了。