Сначала немного о концепции "шаблона":
Значение template.Template
- это "представление проанализированного шаблона" em >. Но формулировка здесь немного «несовершенная». Значение template.Template
может быть (и обычно является) коллекцией нескольких связанных шаблонов. template.Template
имеет неэкспортированное поле:
tmpl map[string]*Template // Map from name to defined templates.
Это поле tmpl
содержит все другие связанные шаблоны, шаблоны, которые видны шаблону и на которые можно ссылаться по их именам.
Подробнее об этом можно прочитать в этом ответе: Имя шаблона Go
Вернемся к методу Template.ParseFiles()
. Этот метод анализирует несколько шаблонов из файлов, переданных ему в качестве параметров. Шаблоны, проанализированные из файлов, будут названы по именам файлов (без папок, только по имени файла), и они будут добавлены во внутреннюю связанную карту шаблонов шаблона t
, назначенного получателем метода.
Разобранные шаблоны добавляться не будут. Для них будет создано несколько отдельных template.Template
значений, но они будут связаны (чтобы они могли ссылаться друг на друга, например, они могут включать друг друга).
Посмотрим на пример. Предположим, у нас есть эти 2 файла шаблона:
a.html
is:
I'm a.
И b.html
:
I'm b.
И пример кода:
t := template.New("a.html")
if _, err := t.ParseFiles("a.html", "b.html"); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
В этом примере создается новый пустой шаблон с именем a.html
, а затем анализируются 2 файла: a.html
и b.html
.
Что будет в результате? t
будет обозначать шаблон a.html
, потому что мы создали его ранее с этим конкретным именем. Запустив код, вы получите следующий результат:
I'm a.
Теперь, если мы изменим первую строку на:
t := template.New("x.html")
А остальное оставим без изменений, запустив его видим нечто похожее:
panic: template: "x.html" is an incomplete or empty template
Причина в том, что t
обозначает шаблон с именем x.html
, но он пуст, поскольку мы ничего не анализировали "в" его, и проанализированные файлы также не соответствовали имени x.html
. Поэтому попытка его выполнить приводит к ошибке.
Теперь, если мы попытаемся выполнить один из связанных с ним именованных шаблонов:
if err := t.ExecuteTemplate(os.Stdout, "a.html", nil); err != nil {
panic(err)
}
Это удается, и снова дает:
I'm a.
person
icza
schedule
07.07.2017