Tak to mozliwe. A html.Template
to właściwie zestaw plików szablonów. Jeśli wykonasz zdefiniowany blok w tym zestawie, ma on dostęp do wszystkich innych bloków zdefiniowanych w tym zestawie.
Jeśli samodzielnie tworzysz mapę takich zestawów szablonów, masz w zasadzie taką samą elastyczność, jaką oferuje Jinja / Django. Jedyną różnicą jest to, że plik html / template pakiet nie ma bezpośredniego dostępu do systemu plików, więc musisz samodzielnie przeanalizować i skomponować szablony.
Rozważmy następujący przykład z dwiema różnymi stronami („index.html” i „other.html”), które dziedziczą po „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}}
Oraz poniższa mapa zestawów szablonów:
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"))
Możesz teraz renderować swoją stronę „index.html”, dzwoniąc
tmpl["index.html"].Execute("base", data)
i możesz wyrenderować swoją stronę „other.html”, dzwoniąc
tmpl["other.html"].Execute("base", data)
Dzięki pewnym sztuczkom (np. Spójnej konwencji nazewnictwa plików szablonów) możliwe jest nawet tmpl
automatyczne generowanie mapy.