В данной статье мы рассмотрим операторы и функции при работе с шаблонами, которые предоставляет шаблонизатор от Go.

Мы уже использовали некоторые операторы в прошлой статье, а точнее {{define}}, {{template}} и {{block}}. Однако есть еще три оператора, которые можно использовать для управления отображением динамических данных на странице — {{if}} , {{with}} и {{range}}.

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

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

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

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

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

Go в ВК ЧАТ в Telegram


Синтаксис оператора Описание

 
Если .Foo содержит какой либо контент, тогда отображается содержимое из C1, в противном случае отображается содержимое из С2.

 
Содержимое из структуры userdata передаётся в точку . и уже в теле оператора when  до его загружающего тега {{ end }} доступ к полям из структуры userdata выполняется сразу через точку .Name, чтобы не писать каждый раз .usernata.Name. Тут оператор when полностью схож с оператором when из языка программирования Python.

или

 
Оператор range выполняет цикл по перебору данных из среза. Допустим у нас есть срез данных с клиентами и мы хотим вывести весь список клиентов на странице.

 

Пример нашей структуры и сраза с данными клиентов для {{ range }}:

Стоит отметить несколько моментов, связанных с данными операторами:

  • Для всех трех операторов, условие {{else}} необязательно. Например, можно написать {{if .Foo}} C1 {{end}}, если нет содержимого C2, которое нужно отобразить;
  • Пустыми значениями являются false, 0, любой указатель nil или значение интерфейса, а также любой массив, срез, карта или строка нулевой длины;
  • Важно отметить, что оператор with и range меняют содержимое . точки.

Пакет html/template также предоставляет некоторые функции, которые вы можете использовать для добавления дополнительной логики в шаблоны и управления тем, что отображается при рендеринге шаблона. Найти полный список функций можно здесь.

Далее представлены самые важные функции от шаблонизатора:

Функция Описание
{{eq .Foo .Bar}} Возвращает true, если .Foo равно .Bar
{{ne .Foo .Bar}} Возвращает true, если .Foo не равно .Bar
{{not .Foo}} Возвращает булево отрицание .Foo
{{or .Foo .Bar}} Возвращает .Foo, если .Foo не пустое, в противном случае выдает .Bar
{{index .Foo i}} Возвращает значение из .Foo по индексу i. Базовый тип .Foo должен быть картой, срезом или массивом
{{printf "%s-%s" .Foo .Bar}} Возвращает отформатированную строку, содержащую значения .Foo и .Bar. Работает так же, как fmt.Sprintf()
{{len .Foo}} Возвращает длину символов .Foo как integer
{{$bar := len .Foo}} Присваивает длину .Foo переменной шаблона $bar

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

Оператор with от golang шаблонизатора

Хорошей возможностью использовать оператор {{with}} является наш файл show.page.tmpl, который мы создали в предыдущем уроке.

Измените его структуру следующим образом:

Теперь между {{with .Snippet}} и его закрывающим тегом {{end}} содержимое точки . хранит в себе содержимое от структуры Snippet. По сути точка становится структурой models.Snippet вместо структуры templateData которая изначально хранилась в этой точки.

Оператор if-else и range от шаблонизатора

В качестве примера давайте воспользуемся операторами {{if}} и {{range}} и обновим домашнюю страницу нашего веб-приложения для отображения таблицы с последними заметками. Результат будет выглядеть примерно следующим образом:

Список всех заметок

Сначала обновим структуру templateData, чтобы она содержала новое поле Snippets в ней будет срез со всеми заметками из базы данных. Сделаем это следующим образом:

Затем обновляем обработчик home, чтобы он извлёк последние заметки из модели базы данных и передал их в шаблон home.page.tmpl:

Теперь давайте перейдем к файлу ui/html/home.page.tmpl и обновим его содержимое для отображения этих заметок в таблице с помощью операторов {{if}} и {{range}}.

В частности:

  • Мы хотим использовать оператор {{if}}, чтобы проверить, содержится какие либо данные в срезе snippets или нет. Если он пуст, мы напишем пользователю следующее Здесь ничего нет... пока что!. В противном случае нужно отобразить таблицу, содержащую информацию о заметках;
  • Мы хотим использовать оператор {{range}} для перебора всех заметок в срезе и отображение их в виде таблицы.

Вот разметка:

Ниже будет приведен пример, чтобы вы знали как еще можно итерировать срез в шаблоне используя {{ range }} путем создания новых переменных $key и $snippet.

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

Убедитесь, что ваши файлы сохранены и перезапустите веб-приложение. Перейдите на страницу http://127.0.0.1:4000 в браузере. Если все прошло по плану, вы должны увидеть страницу, похожую на следующую:

Веб-приложение на Golang

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

В конце каждого урока мы даём исходный код нашего приложения на текущий момент развития.

Скачать: snippetbox-24