Разница между text / template.Templates и html / template.Templates - PullRequest
2 голосов
/ 20 марта 2019

Недавно я заметил, что Templates() из html/template.Template работает иначе, чем text/template.Template.

// go1.12
func main() {
    t := template.New( "" )
    println( len( t.Templates() ) )
}

Результат этого кода зависит от того, импортировали ли вы text/template или html/template. Вы заметите, что текст один печатает 0, в то время как другой печатает 1. В связи с этим я заглянул в GoDoc, и документация html one говорит, что Templates() включает в себя - но без дальнейшего объяснения. И я подумал, что должна быть какая-то причина, почему; почему он должен отличаться друг от друга?

1 Ответ

1 голос
/ 21 марта 2019

Шаблоны, возвращаемые text/template.New() и html/template.New(), являются неполными шаблонами без "тела", их пока нельзя использовать для генерации какого-либо вывода,Вы можете проверить это, если попытаетесь выполнить их:

t := ttemplate.New("t")
h := htemplate.New("h")
fmt.Println(t.Execute(os.Stdout, nil))
fmt.Println(h.Execute(os.Stdout, nil))

Выходы (попробуйте на Go Playground ):

template: t: "t" is an incomplete or empty template
template: "h" is an incomplete or empty template

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

Обратите внимание, что если вы «завершите» определения шаблонов, фактически проанализировав что-либо, то оба будут включать и возвращать собственный шаблон в связанные шаблоны, нетразница в них:

t := ttemplate.Must(ttemplate.New("t").Parse("t"))
h := htemplate.Must(htemplate.New("h").Parse("h"))
fmt.Println(len(t.Templates()), len(h.Templates()))
fmt.Println(t.Execute(os.Stdout, nil))
fmt.Println(h.Execute(os.Stdout, nil))

Будет выведено (попробуйте на Go Playground ):

1 1
t<nil>
h<nil>
...