Теперь, когда все правильно настроено, давайте создадим первую версию нашего веб-приложения на Golang.
Начнем с трех основных пунктов:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
- Первым делом нам потребуется обработчик. Если вы знакомы с MVC паттерном проектирования, обработчики напоминают контроллеры. Они отвечают за выполнение логики приложения, а также за за заголовок и тело HTTP ответа;
- Вторым компонентом является маршрутизатор HTTP запросов (или servemux в Go терминологии). Он хранит связь между URL-шаблонами приложения и соответствующими обработчиками. В приложении, обычно есть один servemux, который содержит все URL маршруты;
- Последним элементом для веб-приложения является веб-сервер. Одним из преимуществ Go является то, что вы можете использовать встроенный веб-сервер и прослеживать входящие HTTP запросы и все это будет частью самого приложения. Вам не потребуется внешний сторонний веб-сервер вроде Nginx или Apache.
Объединим эти компоненты в файле main.go
, чтобы создать работающее приложение.
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 |
package main import ( "log" "net/http" ) // Создается функция-обработчик "home", которая записывает байтовый слайс, содержащий // текст "Привет из Snippetbox" как тело ответа. func home(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Привет из Snippetbox")) } func main() { // Используется функция http.NewServeMux() для инициализации нового рутера, затем // функцию "home" регистрируется как обработчик для URL-шаблона "/". mux := http.NewServeMux() mux.HandleFunc("/", home) // Используется функция http.ListenAndServe() для запуска нового веб-сервера. // Мы передаем два параметра: TCP-адрес сети для прослушивания (в данном случае это "localhost:4000") // и созданный рутер. Если вызов http.ListenAndServe() возвращает ошибку // мы используем функцию log.Fatal() для логирования ошибок. Обратите внимание // что любая ошибка, возвращаемая от http.ListenAndServe(), всегда non-nil. log.Println("Запуск веб-сервера на http://127.0.0.1:4000") err := http.ListenAndServe(":4000", mux) log.Fatal(err) } |
На заметку: Функция-обработчик
home
является обычной функцией с двумя параметрами. Параметрhttp.ResponseWriter
предоставляет методы для объединения HTTP ответа и возвращение его пользователю, а второй параметр*http.Request
является указателем на структуру, которая содержит информацию о текущем запросе (вроде HTTP-методов POST, GET, DELETE… и URL текущего запроса). В будущих уроках мы поговорим об этом подробнее.
Когда вы запустите этот код, он должен запустить веб-сервер на 4000 порту вашего компьютера. Каждый раз при отправки пользователем нового HTTP-запроса этот запрос получает веб-сервер, который проверяет URL и отправляет данный запрос соответствующему обработчику.
Сохраните файл main.go
. Затем попробуйте запустить его из терминала с помощью команды go run
.
1 2 3 |
$ cd $HOME/code/snippetbox $ go run main.go 2020/12/11 13:55:40 Запуск веб-сервера на http://127.0.0.1:4000 |
Когд сервер запущен, откройте браузер и попробуйте перейти по адресу http://127.0.0.1:4000
. Если все правильно, вы должны увидеть следующую страницу:
Внимание: Прежде чем продолжить, стоит пояснить, что маршрутизатор рассматривает URL-шаблон
"/"
как «catch-all» — то есть всеобщий захват. Так, что на данный момент все HTTP запросы к веб-серверу будут обрабатываться функциейhome
, вне зависимости от их URL пути. К примеру, при переходе на другой URL вродеhttp://localhost:4000/foo
будет получен тот же ответ.
Если вернуться в окно терминала, можно остановить веб-сервер через комбинацию Ctrl+C
.
Сетевые интерфейсы в Golang
Сетевой TCP-адрес, который передается в http.ListenAndServe()
, должен быть в формате "host:port"
. Если не указать хост (как мы сделали с ":4000"
), сервер будет прослушивать все доступные сетевые интерфейсы вашего компьютера. Как правило, нужно указать хост в адресе, только если у компьютера несколько сетевых интерфейсов, и требуется только один из них.
В других проектах или документации по Go иногда можно увидеть сетевые адреса, записанные с использованием именованных портов, таких как ":http"
или ":http-alt"
вместо числа. Если используется именованный порт, Go попытается найти соответствующий номер порта в файле /etc/services
при запуске веб-сервера. Если совпадение не будет найдено, Go вернет ошибку.
Запуск веб-приложения в Golang
Во время разработки команда go run
может стать удобным способом опробовать ваш код. По сути, это короткий способ компиляции кода, с помощью которого создается исполняемый бинарный файл в папке /tmp
. Затем этот бинарный файл запускается.
Команда go run
принимает:
- список файлов с расширением
.go
, разделенных пробелами; - путь к определенному пакету (где символ точки
.
представляет текущую папку); - полный путь к модулю.
На данный момент для нашего приложения все три команды эквивалентны:
1 2 3 |
$ go run main.go $ go run . $ go run golangify.com/snippetbox |
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»