我是一位经验丰富的程序员,但是很新。如果这是一个明显的问题或良好的踩踏路径,请提前道歉。我仍然对语言及其语义有所了解。
我试图创建一个Web服务器
,即简化的伪代码看起来像
的东西import (
"io"
"net/http"
"fmt"
"strings"
"encoding/base64"
)
func examineRequest(request *http.Request) {
//looks at request header
if(request headers have one thing){
return "foo"
}
return "bar"
}
func processRequest(responseWriter http.ResponseWriter, request *http.Request) {
folderToServe = examineRequest(request);
if folderToServe == "bar" {
//serve static files from the ./static/bar folder
//go freaks out if I try these
//http.Handle("/", http.FileServer(http.Dir("./static/bar")))
//http.FileServer(http.Dir("./static/bar")()
}
else if folderToServer == "foo" {
//serve static files from the ./static/foo folder
//go freaks out if I try these
//http.Handle("/", http.FileServer(http.Dir("./static/foo")))
//http.FileServer(http.Dir("./static/foo")()
}
}
func main(){
http.HandleFunc("/", processRequest)
//http.Handle("/", http.FileServer(http.Dir("./static")))
}
经验丰富的程序员可能已经发现了问题。我在processRequest中执行我的考试,因此,调用Handle为时已晚 - 但是,你不能为go中的同一路径注册多个句柄,并且嵌套句柄会调用freak出去。
我虽然处理程序可能类似于其他语言中的匿名函数并尝试调用它 - 但是也是这样。
那么 - 有没有办法手动调用从http.FileServer(http.Dir("./static"))
调用返回的处理程序?
在这里问这个问题是否正确?
http模块上下文中的处理程序究竟是什么?
答案 0 :(得分:3)
使用http.FileServer(http.Dir("./static/foo")).ServeHTTP(w, req)
。
//修改
http.FileServer
返回http.Handler
,后者又提供ServerHTTP
方法。