Я создаю веб-сайт с использованием Golang, HTML, JS и CSS. Вот моя структура папок:
/data
(Go files that contain data initialization)
/handler
(Go files for HTTP handling)
/model
(Go files that include model structs)
/static
/css
/images
/js
/webfonts
/template
/elements
/pages
/sections
main.go
go.mod
go.sum
Я инициализирую данные в пакете data, вызывая его из функции main() в начале. Вот моя data.Initialize() функция:
func Initialize() {
log.Println("Site data is initializing:")
serveStaticFiles()
log.Println("Static files are ready!")
parseTemplates()
log.Println("Templates are ready!")
initializeTestimonials()
initializeHomePageData()
log.Println("Home page data is ready!")
initializeAboutPageData()
log.Println("About page data is ready!")
initializeContactPageData()
log.Println("Contact page data is ready!")
initializeNotFoundPageData()
log.Println("404 page data is ready!")
}
Вот моя функция serveStaticFiles(), которая находится внутри пакета data:
func serveStaticFiles() {
fs := http.FileServer(http.Dir("static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
}
Первым делом я вызываю data.Initialize() из функции main():
func main() {
data.Initialize()
mux := http.NewServeMux()
mux.HandleFunc("/", handler.HomeHandler)
mux.HandleFunc("/home", handler.HomeHandler)
mux.HandleFunc("/about", handler.AboutHandler)
mux.HandleFunc("/contact", handler.ContactHandler)
mux.HandleFunc("/404", handler.NotFoundHandler)
log.Println("Starting server on :8080")
http.ListenAndServe(":8080", mux)
}
Однако файлы в каталоге /static не отображаются в браузере, возвращая код 404.
Я также пробовал разные вещи с функцией serveStaticFiles(), например http.Dir("./static"). Кажется, ничего не работает. Я попытался использовать ту же папку с помощью Python, и это сработало. Я пробовал разные порты, и кажется, что не работают только те, которые были запущены из Golang. os.Getwd() возвращает корневую папку проекта, в которой находится файл main.go.
Я ценю, если у кого-то есть идея. Спасибо.
речь идет не только о main.go, но и о том, какой текущий рабочий каталог используется при запуске программы. Проверьте значение os.Getwd() при запуске сервера.
Я запускаю его из корневого каталога, так как там находится main.go. @MarkusWMahlberg
os.Getwd() возвращает корневую папку проекта, в которой находится файл main.go. @LeGEC
Вы регистрируете, что слушаете порт 8080, но код говорит 8000. Вы уверены, что разговариваете с правильным сервером?
Привет, @Biffen. Спасибо, что обратили на это мое внимание. Я пробовал это на разных портах, поэтому забыл изменить его снова. Этот параметр не влияет на результат.





Попробовав разные решения, я нашел проблему. Я обслуживал свои веб-страницы через объект mux, одновременно обслуживая файлы на файловом сервере http. Теперь я обслуживаю веб-страницы через http.HandleFunc(). Проблема устранена, сайт работает корректно. Вот новая функция main():
func main() {
data.Initialize()
http.HandleFunc("/", handler.HomeHandler)
http.HandleFunc("/home", handler.HomeHandler)
http.HandleFunc("/about", handler.AboutHandler)
http.HandleFunc("/contact", handler.ContactHandler)
http.HandleFunc("/404", handler.NotFoundHandler)
log.Println("Starting server on :8080")
http.ListenAndServe(":8080", nil)
}
Вы запускаете свой сервер из корневого каталога вашего проекта, то есть из того же каталога, где находится
main.go?