templateへのデータ渡し【Go】
templateへのデータ渡しを、goファイル上で指定する事ができます。
intやstring
階層が次のようになっているとします。
main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml
main.goの内容です。
var tpl *template.Template func init() { tpl = template.Must(template.ParseGlob("templates/*")) } func main() { nf, err := os.Create("index.html") if err != nil { log.Fatal(err) } err = tpl.ExecuteTemplate(nf, "tpl1.gohtml", 1) // 1を渡す if err != nil { log.Fatal(err) } }
tpl1.gohtmlの内容です。
変数に格納する事で、template内にて使いまわす事ができます。
{{$value := .}} // $valueにgoファイルから渡される内容を格納 ****** tpl1 {{$value}} on {{$value}} // $valueを2度出力 ******
上記条件でmain.goを実行すると、index.htmlの内容が次のようになります。
****** tpl1 1 on 1 ******
slice
「intやstring」で紹介した内容から変更点のみを抜粋します。
main.goです。
func main() { ... s := []string{"a", "i", "u", "e", "o"} err = tpl.ExecuteTemplate(nf, "tpl1.gohtml", s) // sを渡す if err != nil { log.Fatal(err) } }
tpl1.gohtmlの内容です。
スライスなどの中身をループ処理をして取り出す際、
「{{range .}} {{end}}」を使用します。
<h1>tpl1</h1> <ul> {{range .}} // ここの「.」は渡したスライスを意味する <li>{{.}}</li> // ここの「.」はスライスの中からループで取り出した値を意味する {{end}} </ul>
上記条件でmain.goを実行すると、index.htmlの内容が次のようになります。
****** <h1>tpl1</h1> <ul> <li>a</li> <li>i</li> <li>u</li> <li>e</li> <li>o</li> </ul> ******
また、templateファイルを次のようにすれば、indexを出力することもできます。
<h1>tpl1</h1> <ul> {{range $index, $value := .}} // スライスからindexとvalueを取得し、変数に格納 <li>{{$index}}: {{$value}}</li> // 変数をそれぞれ{{}}で囲んで出力する {{end}} </ul>
map
「intやstring」で紹介した内容から変更点のみを抜粋します。
main.goです。
func main() { ... m := map[string]int{ "Milan": 1899, "Inter": 1908, "Juventus": 1897, } err = tpl.ExecuteTemplate(nf, "tpl1.gohtml", m) // mを渡す if err != nil { log.Fatal(err) } }
tpl1.gohtmlの内容です。
中身をループ処理で取り出す際、
「{{range .}} {{end}}」を使用します。
goファイルから渡されたデータを格納する際に、左辺を1つの変数のみ記載した場合は、
valueのみが変数に格納されます。
<h1>tpl1</h1> <ul> {{range $key, $value := .}} // keyとvalue両方を変数に格納する <li>{{$key}}: {{$value}}</li> {{end}} </ul>
上記条件でmain.goを実行すると、index.htmlの内容が次のようになります。
mapの場合、keyの昇順で自動的にsortされます。
****** <h1>tpl1</h1> <ul> <li>Inter: 1908</li> <li>Juventus: 1897</li> <li>Milan: 1899</li> </ul> ******
struct
「intやstring」で紹介した内容から変更点のみを抜粋します。 3つのstructをスライスにして出力します。
main.goです。
type team struct { Name string League string } func main() { ... milan := &team{ Name: "Milan", League: "SerieA", } liverpool := &team{ Name: "Liverpool FC", League: "Premire", } sevilla := &team{ Name: "Sevilla F.C.", League: "La Liga", } teams := []*team{milan, liverpool, sevilla} err = tpl.ExecuteTemplate(nf, "tpl1.gohtml", teams) if err != nil { log.Fatal(err) } }
tpl1.gohtmlの内容です。
スライスなどの中身をループ処理で取り出す際、
「{{range .}} {{end}}」を使用します。
structの場合はフィールド名が定義されていますので、「.<フィールド名>」で出力する事ができます。
<h1>tpl1</h1> <ul> {{range .}} <li>{{.Name}} : {{.League}}</li> {{end}} </ul>
上記条件でmain.goを実行すると、index.htmlの内容が次のようになります。
****** <h1>tpl1</h1> <ul> <li>Milan : SerieA</li> <li>Liverpool FC : Premire</li> <li>Sevilla F.C. : La Liga</li> </ul> ******
スライスではなく単体のstructを渡したい場合には、
templateの「{{range .}} {{end}}」を取り除いて、
goファイルのtemplate.ExecuteTemplate()で渡すデータをstructに変更します。
sliceをフィールドにもつstruct
slice型をフィールドにもつstructは複雑な形式ではありますが、
このようなことも出来るということで、紹介します。
「intやstring」で紹介した内容から変更点のみを抜粋します。
main.goです。
type team struct { Name string League string } type player struct { Name string Team string } func main() { ... milan := &team{ Name: "Milan", League: "SerieA", } liverpool := &team{ Name: "Liverpool FC", League: "Premire", } sevilla := &team{ Name: "Sevilla F.C.", League: "La Liga", } ronaldo := &player{ Name: "Ronaldo", Team: "Juventus", } messi := &player{ Name: "Messi", Team: "Barcelona", } teams := []*team{milan, liverpool, sevilla} players := []*player{ronaldo, messi} err = tpl.ExecuteTemplate(nf, "tpl1.gohtml", struct { // {}{}で、定義、代入を連続して行うことも可能 Teams []*team Players []*player }{ teams, players, }) if err != nil { log.Fatal(err) } }
tpl1.gohtmlの内容です。
スライスなどの中身をループ処理で取り出す際、
「{{range .}} {{end}}」を使用します。
structの場合はフィールド名が定義されていますので、「.<フィールド名>」で出力する事ができます。
rangeに渡す際に、どのフィールドかを「.<フィールド名>」で指定することによって、
ループ処理で取り出す対象を指定する事ができます。
<h1>tpl1</h1> <ul> {{range .Teams}} // Teamsをループ処理 <li>{{.Name}} : {{.League}}</li> {{end}} </ul> <ol> {{range .Players}} // Playersをループ処理 <li>{{.Name}} : {{.Team}}</li> {{end}} </ol>
上記条件でmain.goを実行すると、index.htmlの内容が次のようになります。
****** <h1>tpl1</h1> <ul> <li>Milan : SerieA</li> <li>Liverpool FC : Premire</li> <li>Sevilla F.C. : La Liga</li> </ul> <ol> <li>Ronaldo : Juventus</li> <li>Messi : Barcelona</li> </ol> ******
template.ParseFiles()【Go】 - 技術向上
template.ParseGlob()【Go】 - 技術向上