Да, это возможно. html.Template
Фактически A - это набор файлов шаблонов. Если вы выполняете определенный блок в этом наборе, он имеет доступ ко всем другим блокам, определенным в этом наборе.
Если вы создадите карту таких наборов шаблонов самостоятельно, вы получите в основном такую же гибкость, которую предлагает Jinja / Django. Единственное отличие состоит в том, что пакет html / template не имеет прямого доступа к файловой системе, поэтому вам придется анализировать и составлять шаблоны самостоятельно.
Рассмотрим следующий пример с двумя разными страницами («index.html» и «other.html»), которые наследуются от «base.html»:
{{define "base"}}<html>
<head>{{template "head" .}}</head>
<body>{{template "body" .}}</body>
</html>{{end}}
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}
{{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
автоматически сгенерировать карту.