Переопределение шаблонов Go: иногда работает, иногда не удается
Следующие шаблоны Go обрабатывают без ошибок:
{{block "A" "hello"}}{{end}}
{{define "A"}}{{.}}{{end}}
Вывод "привет", как я и ожидал, прочитав документацию. В отличие от следующего шаблона не анализирует:
{{block "A" "hello"}}A{{end}}
{{define "A"}}{{.}}{{end}}
Здесь я получаю сообщение об ошибке
template: multiple definition of template "A"
Почему второй шаблон выдает ошибку, а первый нет? Это различие предназначено?
Полный код здесь: https://play.golang.org/p/CNAqllVLjB
1 ответ
Ответ лежит в документе html/template.Parse()
:
[...] Ошибка, если результирующий шаблон не пустой (содержит содержимое, отличное от определений шаблонов) и заменит непустой шаблон с тем же именем. (В нескольких вызовах Parse с одним и тем же шаблоном получателя только один вызов может содержать текст, отличный от пробела, комментариев и определений шаблона.)
Ваш первый шаблон работает, потому что {{block "A"}}
определяет пустой шаблон, и поэтому он может быть переопределен.
Ваш второй шаблон не работает, потому что {{block "A"}}
определяет непустой шаблон, и все же вы пытаетесь переопределить его с непустым шаблоном.
Здесь нужно отметить одну вещь: я процитировал документ из html/template
пакет, который должен быть "идентичен" text/template
, Это большую часть времени, но text/template.Parse()
отличается, и пропускает эту важную деталь, но они работают одинаково. Это несоответствие документации, поданной проблема, которая может быть отслежена здесь: проблема # 17360.