Chapter 05無料公開

テンプレート 4 <構文>

定義済みの関数の利用

templateパッケージにはあらかじめ準備された関数があります。ここではsliceに利用できるindexを使ってみます。他にもたくさんあります。少しずつ紹介していこうと思っていますが、まずは全体を俯瞰したいという方はgo docをご確認ください。

main.go
package main

import (
	"log"
	"os"
	"text/template"
)

var tpl *template.Template

func init() {
	tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}

func main() {

	x := []string{"zero", "one", "two", "three", "four", "five"}

	data := struct {
		Suuji   []string
		Aisatsu string
	}{
		x,
		"Hello",
	}

	err := tpl.Execute(os.Stdout, data)
	if err != nil {
		log.Fatalln(err)
	}
}

テンプレートに{{index .Suuji 0}}と記載しています。これはdataで渡したslice Suujiの0番目という意味です。ちなみにテンプレート内のコメントはgolangの記法によります。HTMLの記法ではコメントアウトされないので注意してください。

tpl.gohtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>predefined global functions</title>
</head>
<body>
{{index .Suuji 0}}
{{index .Suuji 1}}
{{index .Suuji 2}}
{{.Aisatsu}}

<!--
https://godoc.org/text/template#hdr-Functions
こちらからgo docに飛べます
-->
go template comment is here:
{{/*(index .Suuji 3).Aisatsu*/}}
</body>
</html>

テンプレート内でif文が組めます

{{if .Name}}表示する内容{{end}}とすると.Nameに値が入っているときだけ表示することができます。.Nameがbool型の場合はtrueのときに表示します。まず、データを作ります。

main.go
package main

import (
	"log"
	"os"
	"text/template"
)

var tpl *template.Template

type dog struct {
	Name    string
	Country string
	IsFast  bool
}

func init() {
	tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}

func main() {

	u1 := dog{
		Name:    "Samoyed",
		Country: "Russia",
		IsFast:  true,
	}

	u2 := dog{
		Name:    "Akita",
		Country: "Japan",
		IsFast:  true,
	}

	u3 := dog{
		Name:    "Chouchou",
		Country: "China",
		IsFast:  false,
	}

	u4 := dog{
		Name:    "Alaskan Malamute",
		Country: "Alaska",
		IsFast:  false,
	}

	u5 := dog{
		Name:    "",
		Country: "nowhere",
		IsFast:  false,
	}

	dogs := []dog{u1, u2, u3, u4, u5}

	err := tpl.Execute(os.Stdout, dogs)
	if err != nil {
		log.Fatalln(err)
	}
}

EXAMPLE #1でデータ全体を表示し、#2、#3、#4でif文を使っています。#2では渡した変数dogs自体にデータが入っているのでdogsに入っているすべてのデータが表示されています。#4ではandを使って.IsFastも条件に含めています。andの語順は少し変わっていて、{{if and .Name .IsFast}}の語順になるので注意してください。

tpl.gohtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>predefined global functions</title>
</head>
<body>


EXAMPLE #1
{{range .}}
    {{.}}
{{end}}


EXAMPLE #2
{{if .}}
    {{.}}
{{end}}


EXAMPLE #3
{{range .}}
    {{if .Name}}
       {{.Name}}
    {{end}}
{{end}}


EXAMPLE #4
{{range .}}
    {{if and .Name .IsFast}}
        Name: {{.Name}}
        Country: {{.Country}}
        IsFast: {{.IsFast}}
    {{end}}
{{end}}


</body>
</html>

出力結果はこうなります。



大小比較

gt ge lt le eq neを使って書きます。語順に注意が必要です。

main.go抜粋
func main() {
	g1 := struct {
		Score1 int
		Score2 int
	}{
		4,
		7,
	}
	_ := tpl.Execute(os.Stdout, g1)
}
tpl.gohtml抜粋
{{if gt .Score1 .Score2}}
SCORE 1 > SCORE 2
{{end}}
{{if le .Score1 .Score2}}
SCORE 1 <= SCORE 2
{{end}}
{{if eq .Score1 .Score2}}
SCORE 1 = SCORE 2
{{end}}
{{if lt .Score1 10}}
SCORE 1 < 10
{{end}}