Oui c'est possible. A html.Template
est en fait un ensemble de fichiers modèles. Si vous exécutez un bloc défini dans cet ensemble, il a accès à tous les autres blocs définis dans cet ensemble.
Si vous créez vous-même une carte de ces ensembles de modèles, vous avez fondamentalement la même flexibilité qu'offre Jinja / Django. La seule différence est que le package html / template n'a pas d'accès direct au système de fichiers, vous devez donc analyser et composer les modèles vous-même.
Prenons l'exemple suivant avec deux pages différentes ("index.html" et "other.html") qui héritent toutes deux de "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}}
Et la carte suivante des ensembles de modèles:
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"))
Vous pouvez maintenant afficher votre page "index.html" en appelant
tmpl["index.html"].Execute("base", data)
et vous pouvez afficher votre page "other.html" en appelant
tmpl["other.html"].Execute("base", data)
Avec quelques astuces (par exemple une convention de dénomination cohérente de vos fichiers modèles), il est même possible de générer la tmpl
carte automatiquement.