templateでは、組み込み関数(ビルドイン関数)を、自作のgoファイルに定義せずに使用することができます。
templateファイルに直接記入することができるのです。
main.goが次のようになっているとします。
type user struct {
Name string
Admin bool
}
func init() {
tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}
func main() {
u1 := user{
Name: "Mike",
Admin: false,
}
u2 := user{
Name: "Karen",
Admin: true,
}
u3 := user{
Name: "",
Admin: true,
}
users := []user{u1, u2, u3}
err := tpl.Execute(os.Stdout, users) // usersをtemplateに渡して画面出力
if err != nil {
log.Fatalln(err)
}
}
tpl.gohtmlの内容です。
EXAMPLE #1では、単純にusersの中身をループで取り出しています。
EXAMPLE #2では、usesの中身が存在する場合にusersをスライスのまま出力します。
EXAMPLE #3では、usersをループ処理し、その中のuserのNameが空でない場合に、Nameを出力します。
EXAMPLE #4では、#3の条件にAdminがtrueであることをandを使って条件追加しています。
NameとAdminどちらもtrueのuserについて、NameとAdminを出力します。
EXAMPLE #1
{{range .}}
{{.}}
{{end}}
EXAMPLE #2
{{if .}}
EXAMPLE #2 - {{.}}
{{end}}
EXAMPLE #3
{{range .}}
{{if .Name}}
EXAMPLE #3 - {{.Name}}
{{end}}
{{end}}
EXAMPLE #4
{{range .}}
{{if and .Name .Admin}}
EXAMPLE #4 - Name: {{.Name}}
EXAMPLE #4 - Admin: {{.Admin}}
{{end}}
{{end}}
以上の条件で実行すると、次の内容が出力されます。
EXAMPLE #1
{Mike false}
{Karen true}
{ true}
EXAMPLE #2
EXAMPLE #2 - [{Mike false} {Karen true} { true}]
EXAMPLE #3
EXAMPLE #3 - Mike
EXAMPLE #3 - Karen
EXAMPLE #4
EXAMPLE #4 - Name: Karen
EXAMPLE #4 - Admin: true
※空行を削除しています。
なお、「and」が組み込み関数にあたり、「if」はアクションにあたります。
ここでもう一つ、比較関数を使用する例をお見せします。
まずはmain.goです。
var tpl *template.Template
func init() {
tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}
func main() {
nf, err := os.Create("index.html") // 同階層にindex.htmlを作成
if err != nil {
log.Fatal(err)
}
ss := struct {
Score1 int
Score2 int
}{
Score1: 9,
Score2: 15,
}
err = tpl.Execute(nf, ss) // ssをtpl.gohtmlに渡した上で、index.htmlに出力する
if err != nil {
log.Fatalln(err)
}
}
続いてtpl.gohtmlです。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
{{if lt .Score1 .Score2}} // less than(先に記述したものが、後に記述したものより小さい)
Score1: {{.Score1}} < Score2: {{.Score2}}
{{end}}
{{if gt .Score1 .Score2}} // greater than(先に記述したものが、後に記述したものより大きい)
Score1: {{.Score1}} > Score2: {{.Score2}}
{{end}}
{{if eq .Score1 .Score2}} // equal(先に記述したものと後に記述したものが等しい)
Score1: {{.Score1}} == Score2: {{.Score2}}
{{end}}
</body>
</html>
実行すると、index.htmlは次のようになります。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
Score1: 9 < Score2: 15 // ltに合致する。html/templateをimportしているため、「<」が実体参照に変換されている
</body>
</html>
※空行を削除しています。
他の例については、下記ドキュメントを参照ください。
template - The Go Programming Language