Goは、text/template パッケージを使用して動的コンテンツを作成したり、ユーザーにカスタマイズされた出力を表示したりするためのサポートを組み込んで提供しています。html/template という兄弟パッケージは同じAPIを提供していますが、追加のセキュリティ機能があり、HTMLの生成に使用されるべきです。
|
|
|

package main
|
|
import (
"os"
"text/template"
)
|
|
func main() {
|
新しいテンプレートを作成し、文字列からその本文を解析できます。テンプレートは静的テキストと、コンテンツを動的に挿入するために使用される{{...}} で囲まれた「アクション」の組み合わせです。
|
t1 := template.New("t1")
t1, err := t1.Parse("Value is {{.}}\n")
if err != nil {
panic(err)
}
|
あるいは、Parse がエラーを返す場合にパニックを起こすために、template.Must 関数を使用できます。これは特に、グローバルスコープで初期化されたテンプレートに便利です。
|
t1 = template.Must(t1.Parse("Value: {{.}}\n"))
|
テンプレートを「実行」することで、アクションに対する特定の値でそのテキストを生成します。{{.}} アクションは、Execute にパラメータとして渡される値に置き換わります。
|
t1.Execute(os.Stdout, "some text")
t1.Execute(os.Stdout, 5)
t1.Execute(os.Stdout, []string{
"Go",
"Rust",
"C++",
"C#",
})
|
以下で使用するヘルパー関数です。
|
Create := func(name, t string) *template.Template {
return template.Must(template.New(name).Parse(t))
}
|
データが構造体である場合、{{.FieldName}} アクションを使用して、そのフィールドにアクセスできます。テンプレートが実行されているときにアクセスできるようにするには、フィールドはエクスポートされるべきです。
|
t2 := Create("t2", "Name: {{.Name}}\n")
|
|
t2.Execute(os.Stdout, struct {
Name string
}{"Jane Doe"})
|
マップにも同じことが当てはまります。マップでは、キー名のケースに対する制約はありません。
|
t2.Execute(os.Stdout, map[string]string{
"Name": "Mickey Mouse",
})
|
if/elseは、テンプレートに条件付き実行を提供します。値は、0、空文字列、nilポインタなどの型の既定値の場合にfalseと見なされます。このサンプルでは、テンプレートのもう1つの機能を示します。アクションで- を使用して空白を切り詰めることです。
|
t3 := Create("t3",
"{{if . -}} yes {{else -}} no {{end}}\n")
t3.Execute(os.Stdout, "not empty")
t3.Execute(os.Stdout, "")
|
rangeブロックを使用すると、スライス、配列、マップ、またはチャネルをループできます。rangeブロック内では、{{.}} はイテレーションの現在のアイテムに設定されます。
|
t4 := Create("t4",
"Range: {{range .}}{{.}} {{end}}\n")
t4.Execute(os.Stdout,
[]string{
"Go",
"Rust",
"C++",
"C#",
})
}
|