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

  1. Каждый раз при отображении веб-страницы наше приложение обрабатывает файлы шаблонов с помощью функции template.ParseFiles(). Мы можем избежать этой повторяющейся работы, обработав файлы один раз во время запуска приложения — и сохранив обработанные шаблоны в кэше в памяти;
  2. В обработчиках home и showSnippet есть код который повторяется. Повторяющийся код мы поместим в функцию-помощник.

Сначала займемся первым пунктом и создадим карту типа map[string]*template.Template для кэширования обработанных шаблонов. Откройте файл cmd/web/templates.go и добавьте туда следующий код:

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

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

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

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

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

Go в ВК ЧАТ в Telegram

Следующим шагом будет инициализация данного кэша в функцию main(). Также надо сделать, чтобы кэш был доступен для наших обработчиков как зависимость через структуру application.

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

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

Откройте файл cmd/web/helpers.go и создаем метод render:

Возможно вы гадаете, почему метод render() имеет параметр *http.Request — даже если он нигде не используется. Это нужно для защиты сигнатуры метода в будущем, потому что в следующих уроках мы расширим возможности метода render и нам понадобится этот параметр.

Теперь у нас всё готово, осталось обновить код в обработчиках home() и showSnippet() следующим образом:

Скачать исходный код

В конце каждой статьи вы можете скачать актуальный на данный момент код нашего веб-приложения на Golang.

Скачать: snippetbox-25