Пока мы разбираем тему маршрутизации, давайте обновим обработчик showSnippet, чтобы он принимал параметр id из строки запроса пользователя следующим образом:

HTTP Метод Шаблон Обработчик Действие
ANY / home Отображение домашней страницы
ANY /snippet?id=1 showSnippet Отображение определенной заметки по её идентификатору
POST /snippet/create createSnippet Создание новой заметки

Позже мы воспользуемся параметром id, чтобы выбрать какую-то заметку из базы данных и показать ее пользователю. А пока что мы просто прочитаем значение из параметра id и вставим его в плейсхолдер ответа.

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram

Нам потребуется обновить функцию showSnippet, чтобы она выполняла две вещи:

  1. Она должна получить значение параметра id из URL строки запроса используя метод r.URL.Query().Get(). Метод всегда будет возвращать значение параметра в виде строки или пустую строку "", если нет совпадающего параметра;
  2. Поскольку значение из параметра id является ненадежным вводом данных от пользователя, значение нужно сперва проверить. Значение из параметра id должно содержать положительное целое число. Это можно реализовать если мы попытаемся преобразовать строку из id в целое число с помощью функции strconv.Atoi(), а затем проверим если значение больше нуля.

Это делается следующим образом:

Посмотрим, как это работает! Если вы не разобрались, где вставить этот код, то не переживайте. Ниже будет весь код из файла main.go который мы собрали из всех статей и он актуален на текущей момент — текущей статьи.

Перезапустите приложение и попробуйте перейти на URL http://127.0.0.1:4000/snippet?id=123. Вы должны увидеть следующее содержимое:

Отображение заметки

Также, можете попробовать посетить некоторые URL, у которых есть недействительные значения для параметра id, или нет этого параметра вообще. К примеру:

Для всех этих запросов вы должны получить ответ 404 page not found.

Страница на найдена Golang

Интерфейс io.Writer в Golang

Если заглянуть в документацию для функции fmt.Fprintf(), вы увидите, что в качестве первого параметра она принимает интерфейс io.Writer

… но мы вместо него передали объект http.ResponseWriter — и все сработало хорошо.

Мы можем это сделать, потому что тип io.Writer является интерфейсом, а объект http.ResponseWriter удовлетворяет интерфейсу, потому что у него есть метод w.Write().

Если вы новичок в Go, то урок по изучению интерфейсов поможет лучше понять некоторые аспекты текущей статьи. Достаточно знать, что на практике — везде, где вы видите параметр который имеет тип io.Writer, то ему можно передать объект http.ResponseWriter. Все написанное после этого будет отправлено как тело HTTP ответа.

Готовый код веб-приложения на Golang

Ниже предоставляем код веб-приложения на текущий момент. По мере прохождения нашего учебника по созданию сайта на golang в конце статьи мы всегда оставляем готовый код. Данный код будет обновляться уже в следующей статье и у вас всегда должен быть актуальная версия кода.