Файловый сервер Go не обслуживает папку

Я создаю веб-сайт с использованием 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?

Markus W Mahlberg 24.06.2024 07:05

речь идет не только о main.go, но и о том, какой текущий рабочий каталог используется при запуске программы. Проверьте значение os.Getwd() при запуске сервера.

LeGEC 24.06.2024 08:26

Я запускаю его из корневого каталога, так как там находится main.go. @MarkusWMahlberg

Seyit Ahmet Gökçe 24.06.2024 15:11
os.Getwd() возвращает корневую папку проекта, в которой находится файл main.go. @LeGEC
Seyit Ahmet Gökçe 24.06.2024 15:14

Вы регистрируете, что слушаете порт 8080, но код говорит 8000. Вы уверены, что разговариваете с правильным сервером?

Biffen 24.06.2024 15:18

Привет, @Biffen. Спасибо, что обратили на это мое внимание. Я пробовал это на разных портах, поэтому забыл изменить его снова. Этот параметр не влияет на результат.

Seyit Ahmet Gökçe 24.06.2024 17:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробовав разные решения, я нашел проблему. Я обслуживал свои веб-страницы через объект 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)
}

Другие вопросы по теме