Переопределение шаблонов 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.

Другие вопросы по тегам