Да, это возможно. html.Template
на самом деле представляет собой набор файлов шаблонов. Если вы выполняете определенный блок в этом наборе, он имеет доступ ко всем другим блокам, определенным в этом наборе.
Если вы создадите карту таких наборов шаблонов самостоятельно, у вас будет в основном та же гибкость, которую предлагает Jinja/Django. Единственное отличие состоит в том, что пакет html/template не имеет прямого доступа к файловой системе, поэтому вы должны разобрать и составить шаблоны самостоятельно.
Рассмотрим следующий пример с двумя разными страницами ("index.html" и "other.html"), которые наследуются от "base.html":
// Content of base.html:
{{define "base"}}<html>
<head>{{template "head" .}}</head>
<body>{{template "body" .}}</body>
</html>{{end}}
// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}
// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}
И следующая карта наборов шаблонов:
tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))
Теперь вы можете отобразить свою страницу index.html, вызвав
tmpl["index.html"].Execute("base", data)
и вы можете отобразить свою страницу «other.html», позвонив
tmpl["other.html"].Execute("base", data)
С некоторыми хитростями (например, согласованным соглашением об именах файлов шаблонов) можно даже автоматически сгенерировать карту tmpl
.
person
tux21b
schedule
13.07.2012