Шаблон индекса Голанга в том числе
У меня есть два шаблона в моем проекте, например, так:
var indextemplate = template.Must(template.New("").Parse(`<!DOCTYPE html>
<form action="/compare" method="post">
<input type="date" name="from" required>
<input type="submit">
</form>`))
var comparetemplate = template.Must(template.New("").Parse("Hours since {{.From}} are {{.Duration}}"))
Я не понимаю, как структурировать код, поэтому у меня есть шаблон HTML (с головой и </html>
в конце) и просто включите эти шаблоны в тело.
Я также не совсем понимаю, как лучше структурировать код так, чтобы шаблон соответствовал обработчику. Начиная с IIUC вам лучше всего скомпилировать шаблон вне обработчика.
1 ответ
То, что вы должны знать, это то, что значение template.Template
может быть набором из нескольких шаблонов, см. его Template.Templates()
метод, который возвращает эту коллекцию.
Каждый шаблон в коллекции имеет уникальное имя, на которое он может ссылаться (см. Template.Name()
). И есть {{template "name" pipeline}}
действие, и с его помощью вы можете включить другие шаблоны в шаблон, еще один шаблон, который является частью коллекции.
Смотрите этот пример. Давайте определим 2 шаблона:
const tmain = `<html><body>
Some body. Now include the other template:
{{template "content" .}}
</body></html>
`
const tcontent = `I'M THE CONTENT, param passed is: {{.Param}}`
Как вы видете, tmain
включает в себя еще один шаблон с именем "content"
, Вы можете использовать Template.New()
метод (подчеркиваю: метод, не путать с функцией template.New()
) создать новый связанный именованный шаблон, который будет частью шаблона, метод которого вы вызываете. В результате они могут ссылаться друг на друга, например, они могут включать друг друга.
Давайте посмотрим код, который разбирает эти 2 шаблона в один template.Template
поэтому они могут ссылаться друг на друга (проверка ошибок для краткости опущена):
t := template.Must(template.New("main").Parse(tmain))
t.New("content").Parse(tcontent)
param := struct{ Param string }{"paramvalue"}
if err := t.ExecuteTemplate(os.Stdout, "main", param); err != nil {
fmt.Println(err)
}
Вывод (попробуйте на Go Playground):
<html><body>
Some body. Now include the other template:
I'M THE CONTENT, param passed is: paramvalue
</body></html>
альтернатива
Также обратите внимание, что если у вас есть много и больше шаблонов, это становится менее читабельным и обслуживаемым. Вы должны рассмотреть вопрос о сохранении ваших шаблонов в виде файлов, и вы можете использовать template.ParseFiles()
а также template.ParseGlob()
оба могут одновременно анализировать несколько файлов и формировать из них коллекцию шаблонов, чтобы они могли ссылаться друг на друга. Имена шаблонов будут именами файлов.