単一の値のみを渡すことができますが、その値は、構造体、マップ、またはスライスなど、複数の値の合成値である場合があります。したがって、テンプレート用の複数のデータを astruct
または でラップするだけmap
です。
の例struct
:
type Data struct {
Results []User // Must be exported!
Other []int // Must be exported!
}
data := &Data{results, []int{1, 2, 3}}
if err := GetTemplate("list").Execute(w, data); err != nil {
// Handle error
}
また、新しい名前付きの型は必要ないことに注意してください。次のような匿名の構造体リテラルを使用することもできます。
data := struct {
Results []User // Must be exported!
Other []int // Must be exported!
}{results, []int{1, 2, 3}}
の例map
:
m := map[string]interface{}{
"Results": results,
"Other": []int{1, 2, 3},
}
if err := GetTemplate("list").Execute(w, m); err != nil {
// Handle error
}
string
マップを使用する場合、大文字の s をキーとして使用する必要はないことに注意してください。たとえば、 "results"
andも使用でき"other"
ます (ただし、私の意見では、大文字の開始文字を使用したキーを使用する方がよいでしょstruct
う。修正する必要が少なくなります)。
どちらの場合も、 で[]User
結果を参照し{{.Results}}
、 で追加の int スライスを参照できます{{.Other}}
。
たとえば、ユーザーを範囲指定するには:
{{range .Results}}
User name:{{.Name}}
{{end}}
の例slice
:
s := []interface{}{
results,
[]int{1, 2, 3},
}
if err := GetTemplate("list").Execute(w, s); err != nil {
// Handle error
}
これは読みにくいですが、実行可能な解決策です。テンプレートでは、「個々の」値を取得するためにテンプレート データにインデックスを付ける必要があります。次に例を示します。
{{range index . 0}}
User name:{{.Name}}
{{end}}
Other: {{index . 1}}
Go Playgroundで試してみてください。
他の方法...
他の「理論的な」方法もありますが、機能するという理由だけでそれらを使用することはありません。
たとえば、 receive が値を提供するチャネルを渡すこともできます。
さらに別の解決策は、呼び出されたときに値を返すカスタム関数を登録することです。