はじめに
Go言語でWebアプリを作れるのか調べていたところ、公式のテンプレートエンジンではツラいとあったが、何がツラいのかいまいちわからなかったので、調べてみました。
ツラいこと
- templateでレイアウトを継承できない
- templateごとにstructを定義しなくてはならない
- Viewの関数が用意されていない
解決作
templateでレイアウトを継承できない
これには以下のようにテンプレートを分けて定義して、挿入することで解決できます
package main
import (
"os"
"text/template"
)
func main() {
t := template.Must(template.New("").Parse(templ))
template.Must(t.Parse(content))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}
// 実際は別ファイル
const templ = `ベーステンプレート
内容: {{template "content"}}
`
// 実際は別ファイル
const content = `{{define "content"}}挿入したいテンプレート{{end}}`
他にも、header, footerにわけてる方もいました。
Go の html/template でヘッダーやフッター等の共通化を実現する方法
templateごとにstructを定義しなくてはならない
これは解決策は見つけられませんでしたが、そこまで手間でもないのではないでしょうか?
Viewの関数が用意されていない
以下のページにあるようにFuncMapを使えばtemplate側でも使えます。
text/template上で動く計算機を作る #golang
また、template側で関数が必要なのはレイヤー化できてるのか怪しい気もします。
結論
現在の調査の段階ではそんなにツラい内容はなかったように思います。
エスケープなどの処理も自動で入れられて、言語レベルのサポートとしては十分ではないでしょうか?
まだまだGo言語は始めたばかりなので、自分でも実装しつつ調べていきます!