はい、可能です。Ahtml.Template
は、実際には一連のテンプレート ファイルです。このセットで定義されたブロックを実行すると、このセットで定義された他のすべてのブロックにアクセスできます。
このようなテンプレート セットのマップを独自に作成すると、基本的には Jinja / Django と同じ柔軟性が得られます。唯一の違いは、html/templateパッケージはファイル システムに直接アクセスできないため、自分でテンプレートを解析して構成する必要があることです。
「base.html」から継承する 2 つの異なるページ (「index.html」と「other.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
マップを自動的に生成することさえ可能です。