この記事では、プログラミング言語Goにおけるテンプレートとその使用方法について説明します。
テンプレートとは?
テンプレートは共通のビューであり、そのビューを意味のあるものにするためにデータを渡すことができます。
またテンプレートは、あらゆる方法でカスタマイズすることができ、あらゆる出力を得ることができます。
Golangのtemplateパッケージ
Goのテンプレート作成には、text/templateとhtml/templateの2つのパッケージがあります。
textパッケージはテキストをテンプレートに挿入することを可能にし、一方、HTMLテンプレートは安全なHTMLコードを提供することによって私たちを助けてくれます。
テンプレートの部品
使い始める前に、コードのさまざまな部分を見てみましょう。
テンプレートアクション
テンプレートアクションとは、主な制御フロー、データ評価、関数のことです。これらのアクションは、最終的な出力がどのように表示されるかを制御します。
以下に、いくつかの基本的なアクションを紹介します。
{{ /* a comment inside template */ }}
ルート要素をレンダリングする場合は以下の通り。
{{ . }}
制御構造
制御構造は、テンプレートの制御フローを決定します。構造化された出力を生成するのに役立ちます。以下は、テンプレートにおける制御構造の例です。
if文は以下の書き方
{{ if .condition }} {{ else }} {{ end }}
rangeブロックは以下の書き方
{{ range .Items }} {{ end }}
Rangeブロックは、指定されたリストに対して反復処理を行います。
関数
関数はテンプレートの中でも使用することができます。
パイプ(|)演算子を使って、定義済みの関数を使うことができます。
Golangでテンプレートをパースする
いくつかのテキストと HTML テンプレートを解析してみます。
データにアクセスする
渡されたデータにアクセスするには、以下のようにドット(.)構文を使用します。
{{ .data }}
textテンプレートのパース
以下のようにテキストテンプレートをパースします。
package main
import (
"os"
"text/template"
)
type User struct {
Name string
Bio string
}
func main() {
u := User{"Tanaka", "a regular user"}
ut, err := template.New("users").Parse("The user is {{ .Name }} and he is {{ .Bio }}.")
if err != nil {
panic(err)
}
err = ut.Execute(os.Stdout, u)
if err != nil {
panic(err)
}
}
上のコードでは、構造体をテキストテンプレートに渡すと、次のような出力が得られます。
The user is Tanaka and he is a regular user.
HTMLテンプレートのパース
HTML文書を解析してみましょう。この例では、以下のショーコードを使用します。
hello.gohtmlファイルにおいて以下を記述し、
<h1>Go templates</h1>
<p>The user is {{ .Name }}</p>
<h2>Skills:</h2>
{{ range .Skills }}
<p>{{ . }}</p>
{{ end }}
main.goファイルに以下を記述します。
package main
import (
"os"
"html/template"
)
func main() {
t, err := template.ParseFiles("templates/hello.gohtml")
if err != nil {
panic(err)
}
data := struct {
Name string
Skills []string
}{
Name: "John Doe",
Skills: []string{
"C++",
"Java",
"Python",
},
}
err = t.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
Golangでのテンプレート検証
テンプレートが有効かどうかを確認するために、template.Must()関数を使用します。これはパース中にテンプレートを検証するのに役立ちます。
tmp := template.Must(template.ParseFiles("tmp.html"))
Golangにおけるテンプレート化の使用法
テンプレートは、一般的なWebページ制作のみならず、以下のような様々な条件下で非常に有用です。
- APIからのデータを使ってWebページを生成する。
- メールを生成する
- HUGOテンプレートによるWebサイトの作成。