目录树:
.
├── main.go
└── web
├── app.go
└── views
├── index.html
└── js
└── app.jsx
这有效:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./web/views")))
http.ListenAndServe(":3000", nil)
}
但这会返回404 page not found
:
main.go:
package main
import (
"{dir with main.go}/web"
)
func main() {
web.StartHttp()
}
app.go:
package web
import (
"fmt"
"net/http"
)
func StartHttp() {
fmt.Println("STARTHTTP - CHECK 01")
http.Handle("/", http.FileServer(http.Dir("./views")))
http.ListenAndServe(":3000", nil)
}
终端打印STARTHTTP - CHECK 01
,因此调用StartHttp()
函数,并且终端要求允许传入的网络连接,因此http服务器似乎正在侦听端口。
是否有某种类型的上下文未传递给其他包?
请记住,Go是一种编译语言;程序在运行时发生的大多数事情。
特别是,在这种情况下,对http.Dir()
的调用在运行时发生,这意味着在运行时计算路径。
因为您提供的路径是相对路径,所以它相对于运行应用程序的工作目录。源代码所在的目录与此处无关。
在http.Dir()
的一次调用中,你给出了./web/views
这个参数,但在另一个中,你给出了./views
这个参数。事实证明,基于您执行程序的目录的正确路径是./web/views
。当您使用错误的路径执行程序时,您会收到404 page not found
错误,因为您指定的路径在您的工作目录中不存在。
您为http.Dir
提供的路径是相对于运行应用程序的位置(其工作目录,您发布的目录树的根,在您的情况下),而不是相对于.go
文件的位置。只需更改./web/views
的路径,它应该工作。
在您的情况下,返回404 Not Found
,因为目录树的顶层没有views
文件夹,因此没有要提供的文件。