Перед добавлением нового кода в файл main.go
стоит разобраться, как лучше организовать и структурировать наш проект.
Важно понимать, что не существует одного правильного или даже рекомендуемого способа структурирования веб-приложений в Go. Это хорошо и плохо одновременно. Это означает, что у вас есть свобода в организации кода, но также вы можете запутаться в неопределенности, пытаясь решить, какая структура будет наиболее оптимальной.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
С опытом работы в Go вы увидите, какие шаблоны проектирования подходят лучше в зависимости от ситуации. В начале пути мы бы посоветовали излишне не усложнять вещи. Старайтесь применять какую либо структуру и усложнять её только тогда, когда это явно необходимо.
Для данного проекта мы будем использовать структуру для проекта, которая следует популярному и проверенному подходу. Это надежная отправная точка, и потом вы сможете повторно использовать данную общую структуру в других проектах.
Убедитесь, что вы находитесь в корне репозитория проекта и выполните следующие команды:
1 2 3 4 5 |
$ cd $HOME/code/snippetbox $ rm main.go $ mkdir -p cmd/web pkg ui/html ui/static $ touch cmd/web/main.go $ touch cmd/web/handlers.go |
Структура вашего веб-проекта должна выглядеть следующим образом:
Давайте рассмотрим, для чего будет использоваться каждая из данных папок.
- Папка
cmd
будет содержать папки разных приложений в проекте. На данный момент у нас будет только одно исполняемое приложение и это наше веб-приложение. Оно будет находиться в папкеcmd/web
; - Папка
pkg
будет содержать вспомогательный код, не зависящий от приложения в проекте. Мы будем использовать данную папку для хранения вспомогательного кода, который потенциально может быть повторно использован. Это могут быть вспомогательные средства проверки данных и модели базы данных для проекта; - Папка
ui
будет содержать файлы HTML шаблона для пользовательского интерфейса, используемые веб-приложением. В частности, папкаui/html
будет содержать HTML шаблоны, а папкаui/static
будет содержать статические файлы (например, CSS, JS и изображения).
Почему мы используем именно эту структуру?
У данной структуры есть два больших преимущества:
- В структуре есть четкое разделение между Go файлами с кодом и файлами пользовательского интерфейса (HTML, CSS, JS) которые никак с Go не связаны. Весь написанный нами код на Go будет находиться исключительно в папках
cmd
иpkg
. Корень проекта останется свободным для хранения ресурсов, не относящихся к Go. Это могут быть файлы пользовательского интерфейса, make-файлы и настройки модулей (включая наш файлgo.mod
). Данная структура упростит работу с веб-приложением, когда дело дойдет до развития и развертывания приложения в будущем; - Структура отлично масштабируется, если вы хотите добавить в свой проект еще одно исполняемое приложение. Например, вы можете захотеть добавить CLI (Command Line Interface) для автоматизации некоторых административных задач в будущем. С такой структурой можно создать это CLI приложение в
cmd/cli
, и оно сможет импортировать и повторно использовать весь код, который была написан в папкеpkg
.
Рефакторинг существующего веб-приложения
Давайте быстренько перенесем уже написанный код, чтобы он использовал эту новую структуру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "log" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", home) mux.HandleFunc("/snippet", showSnippet) mux.HandleFunc("/snippet/create", createSnippet) log.Println("Запуск сервера на http://127.0.0.1:4000") err := http.ListenAndServe(":4000", mux) log.Fatal(err) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package main import ( "fmt" "net/http" "strconv" ) func home(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } w.Write([]byte("Привет из Snippetbox")) } func showSnippet(w http.ResponseWriter, r *http.Request) { id, err := strconv.Atoi(r.URL.Query().Get("id")) if err != nil || id < 1 { http.NotFound(w, r) return } fmt.Fprintf(w, "Отображение определенной заметки с ID %d...", id) } func createSnippet(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { w.Header().Set("Allow", http.MethodPost) http.Error(w, "Метод не дозволен", 405) return } w.Write([]byte("Создание новой заметки...")) } |
Это тот же код из прошлых статей, просто мы удалили комментарии.
Теперь наше веб-приложение состоит из нескольких файлов исходного кода из папки cmd/web
.
Для запуска веб-приложения в текущем виде — придется использовать команду go run
в терминале следующим образом:
1 2 3 |
$ cd $HOME/code/snippetbox $ go run ./cmd/web 2021/01/19 14:27:49 Запуск сервера на http://127.0.0.1:4000 |
Запуск веб-приложения в Goland
Если по каким либо причинам у вас не получилось запустить веб-приложение из терминала, то вот пример как запустить приложение в Goland.
Скачать готовые файлы веб-приложения
В конец каждой статьи есть данный раздел где вы можете скачать актуальный код веб-приложения на данный момент.
Скачать: snippetbox-6.zip
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»