Templateを分割(パーツ化)して使用する

テンプレートを分割(パーツ化)、複数のテンプレートを組み合わせて使用する方法です。

  • clock.tpl
    <!DOCTYPE html>
    <html><body>
        <p>Date={{.Date}}</p>
    	<p>Time={{.Time}}</p>
    {{template "footer"}}
    </body></html>
    
    パーツ化したテンプレートを読み込みたい箇所に{{template "xxx"}}のように記述します。
  • footer.tpl
    {{define "footer"}}
    	<p>© 2017 Copyright xxx</p>
    {{end}}
    
    パーツ化するテンプレートは{{define "xxx"}}のように名前を付けておきます。


そして、テンプレートをパースする方法(実装)ですが、2パターン紹介しておきます。

  • パターン1
    tpl := template.Must(template.ParseFiles("clock.tpl"))
    tpl = template.Must(tpl.ParseFiles("footer.tpl"))
    
    パターン1は、パースしたテンプレートに追加でパースしてあげる方法です。
    そのまんまですねw
  • パターン2
    tpl := template.Must(template.ParseGlob("*.tpl"))
    
    パターン2は、まとめてパースする方法です。
    こちらのほうが簡単ではありますが、テンプレートファイルが他にもある場合には対象の指定にちょっと困ったりします。


上記の方法はどちらもプログラムにも手が入ってしまっています。
できればプログラムでパース(指定)するのは親テンプレート(1ファイル)のみで、子(インクルードする)テンプレートは自動でパースしてくれると良いのですが、標準では無理のようです。

なので、標準で無理なら作ってしまえ!ということで自作のパッケージを作ってみました(笑)
興味のある人は下記からどうぞ。
goingtpl(インクルード対応テンプレート)