Я хотел создать небольшое автономное веб-приложение на Go, противоположное обычному веб-приложению, в котором ресурсы будут обслуживаться отдельно через CDN или HTTP-сервер, такой как Nginx. Однако если производительность не является критической проблемой или приложение предназначено для низкого трафика, использование автономного приложения упрощает развертывание и распространение, поскольку это всего лишь исполняемый двоичный файл. Доступно несколько пакетов для встраивания ресурсов в приложение Go: Рис Статик Биндата Я не буду вдаваться в особенности каждой библиотеки, но я предпочитаю подход из-за его простоты использования и активной поддержки. с связыванием данных Начиная Сначала давайте создадим внутри каталога вашего проекта: index.html frontend/ <html> <body> Hello, World! </body> </html> Теперь, когда у нас есть настройка проекта и статический ресурс для тестирования, давайте установим с помощью команды: Bindata go get -u github.com/jteeuwen/go-bindata/... Мы готовы запустить серверный код веб-приложения. Создайте файл и скопируйте следующий код: main.go package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) } Важная строка в этом коде: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... Строка выше позволяет нам запускать команду при вызове . Начиная с версии 1.4, вы можете запускать собственные команды на этапе генерации. Это просто вопрос добавления в ваш файл go. go-bindata go generate //go:generate command argument... Командная строка имеет несколько параметров, поэтому ознакомьтесь с по ее использованию. В нашем случае мы говорим: go-bindata документацией определяет часть пути для статических -prefix "frontend/" определяет имя пакета, используемое в сгенерированном коде. -pkg main определить имя сгенерированного файла -o bindata.go После запуска команды вы должны увидеть сгенерированный файл с . Структура вашего проекта должна выглядеть следующим образом: go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go Логика обслуживания статических файлов находится в функции , которая принимает запрос и проверяет, соответствует ли путь статическому пути. Проверка осуществляется с помощью функции , автоматически экспортируемой . Если ресурс не существует, мы возвращаем , в противном случае мы возвращаем содержимое ресурса. static_handler Asset bindata.go 404 Остальная часть кода предназначена для создания веб-приложения и привязки нашего шаблона для соответствия всем входящим запросам для . Если у вас возникли проблемы с пониманием этого кода, ознакомьтесь с официальной Go для . static_handler / документацией http package В качестве быстрого напоминания о том, как Go обрабатывает пакеты, все идентификаторы будут автоматически экспортироваться в другие пакеты с тем же именем, если первая буква имени идентификатора начинается с заглавной буквы. На основании этого правила предоставляет функцию для пакета. Это загружает и возвращает актив для данного имени. Он возвращает ошибку, если ресурс не может быть найден или не может быть загружен. bindata.go Asset main