私がしていることは、構造体 (私は「ページ」オブジェクトと呼んでいます) を作成し、必要なエンティティを設定して、テンプレートでそれらを操作することです。
func myPage(w http.ResponseWriter, r *http.Request) {
var user *User // fetch from somewhere
page := struct {
Title string
User *User
}{"My title", user}
return templates.ExecuteTemplate(w, "myPage", page)
}
テンプレートは次のようになり、構造体のすべてのフィールドにアクセスできます。
{{define "myPage"}}
{{template "head" .}}
Title: {{.Title}}<br />
Name: {{.User.Name}}<br />
{{template "tail" .}}
{{end}}
({{template "head" .}}
別のテンプレート、ここではヘッダーとフッターが含まれることに注意してください。)
もう 1 つよく使用するのは、テンプレート内の変数です。ドル記号を使用して変数を定義できます。
次の例はあまり洗練されたものではありませんが、何が可能かについてのアイデアが得られるかもしれません。3 つのスライスがあるとします。1 つは " User
" オブジェクト、もう 1 つは " Spot
" オブジェクト、もう 1 つは " Checkin
" オブジェクトです。それらはすべて同じ長さで、位置によって関連付けられています (それぞれのインデックス 0 には、チェックインされたユーザー、チェックインした場所が含まれ、チェックイン オブジェクトにはそれが発生した時間が含まれます)。「範囲」は、スライスを反復処理するときに、インデックス ($i
例では) と値 ( $v
) の 2 つの変数を提供します。「インデックス」を使用すると、スライス内のエンティティを要求できるため、{{$user := index $checkinUsers $i}}
$i が指す位置にオブジェクトが表示されます。
{{$checkinUsers := .CheckinUsers}}
{{$checkinSpots := .CheckinSpots}}
{{range $i, $v := .Checkins}}
{{$user := index $checkinUsers $i}}
{{$spot := index $checkinSpots $i}}
<tr>
<td>
{{$user.FirstName}} {{$user.LastName}} @ {{$spot.Description}} ({{$v.Time}})<br />
</td>
</tr>
{{end}}
繰り返しますが、この例はあまりエレガントではありませんが、Go で動的 HTML を JSP と同じくらい簡単に作成できることを理解していただければ幸いです (私の経験では、結果のページは JSP よりもクリーンであり、したがって、経験の浅い Web 開発者やデザイナー)。
Ex animo、/Alexander Yngling。