Вывод HTML с помощью fmt.Printf
Для вывода небольших фрагментов HTML можно использовать стандартную функцию fmt.Printf. Например:
fmt.Printf("<h1>Main text</h1>")
Однако этот подход неудобен и может приводить к ошибкам, особенно при выводе сложного HTML-кода.
Более удобный, но всё ещё недостаточный способ:
fmt.Printf(`<h1>Заголовок</h1><p>Текст</p>`)
Этот метод лучше предыдущего, но не подходит для создания полноценных HTML-страниц.
Использование пакета html/template
Для вывода полноценных HTML-страниц используется пакет html/template:
import (
t"html/template"
t"net/http"
)
Создадим переменные: tmpl для хранения шаблона и _ для игнорирования ошибок (на данном этапе).
tmpl, _ := template.ParseFiles("templates/home_page.html")
Обратите внимание на путь к файлу шаблона – templates/home_page.html. Он подгружается из папки templates.
Для отображения шаблона используется метод Execute:
tmpl.Execute(w, bob)
Здесь w – объект http.ResponseWriter, а bob – объект данных, передаваемый в шаблон.
Создание HTML-шаблона (home_page.html)
Файл templates/home_page.html содержит базовую HTML-структуру. Указана кодировка UTF-8 для корректного отображения кириллицы:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Главная страница</title>
</head>
<body>
<h1>Главная страница</h1>
</body>
</html>
После запуска сервера на странице отображается содержимое home_page.html.
Работа с шаблонами
Шаблонизатор позволяет выводить переменные из основного файла. Внутри шаблона используется двойные фигурные скобки {{ }}:
<p>Пользователь: {{.Name}}</p>
Используется точечная нотация для доступа к полям объекта. Имена полей должны начинаться с заглавной буквы.
<p>Возраст пользователя: {{.Age}}</p>
<p>Деньги: {{.Money}}</p>
Условные операторы и циклы
В шаблонах доступны условные операторы if, else if и else:
{{if eq .Name "Bob"}}
<p>Привет</p>
{{else}}
<p>А ты кто?</p>
{{end}}
Доступны операторы сравнения: eq (равно), ne (не равно), lt (меньше), gt (больше), le (меньше или равно), ge (больше или равно).
Для перебора списков используется цикл range:
<ul>
{{range .Hobbies}}
<li>{{.}</li>
{{end}}
</ul>
Для обработки пустого списка можно использовать else:
{{range .Hobbies}}
<li>{{.}</li>
{{else}}
<p>У пользователя нет хобби.</p>
{{end}}
Подключение Bootstrap
Для улучшения внешнего вида можно подключить Bootstrap:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
Можно использовать примеры шаблонов с сайта Bootstrap для создания дизайна. Необходимо подключить дополнительные CSS-файлы, если они требуются.
В этом уроке изучена работа с HTML-шаблонами в Go, использование условных операторов и циклов, а также подключение Bootstrap для улучшения дизайна. В следующих уроках будет продолжена разработка с подключением базы данных и добавлением новых функций.