#golang 複数のテンプレートファイルを簡単にParseするには

Posted by kwmt on Mon, Mar 18, 2013

「golangでhtmlファイルの一部を別ファイルに分けるには」で、テンプレートファイルを分割するエントリを書きました。分割したファイルをパースする関数は、template.ParseFiles(filenames …string)です。分割したファイルが2,3個ならこのParserFiles関数でよいと思いますが、もっと多くなったらファイルパスをゴリゴリ書かないといけません。

ゴリゴリ書かなくてもいい方法があります。それは、template.ParseGlob関数を使用することです。ファイルをパターン化することができます。

まずは下記のコードを見て下さい。(golang.orgのExampleの訳です)

上記のコードは、$TMPDIR/template+suffixというディレクトリに、T0.tmpl, T1.tmpl, T2.tmpl という3つのファイルがあった時(このコードではテスト用に作成していますが)、パターン(pattern)を

として、template.ParseGlobに渡しています。これで、

と書いたことと同じになります。

追記(2013/3/19)

上記の例の場合は、T0.tmplが親となって、T1、T2を呼び出しているため、上記patternで最初に見つかるT0.tmplが生成されるテンプレートの名前となるので、特に問題ないのですが、たとえば、T1.tmplが親となって、T0とT2を呼び出すようにした場合は、なにも表示されません。(ためしに、上記コードの3行目と5行目のcontens要素を入れかえて実行してみて下さい)

これを回避するには、template.New("T1.tmpl")でテンプレートを生成して、その生成されたテンプレートに対して、ParseGlob(patter)とします。具体的には次のようにします。

これは、たとえばテンプレートファイルとして、main.tmpl、header.tmpl、footer.tmplというファイルがあるとき、パターンを “*.tmpl”としてParseGlobすると、生成されたテンプレート名はfooter.tmplになり、main.tmplをテンプレートとしたいときに有効です。(このサンプルはこちら

参考

ここに上記Exampleの全体のソースをおいてます。(cloneすればすぐに確かめることができるようにしています)



comments powered by Disqus