11

Go Template に 2 つのデータ オブジェクトを渡したいです。1 つは MongoDB クエリの結果で、もう 1 つは整数配列です。

MongoDB クエリ:-

var results []User
sess, db := GetDatabase()
defer sess.Close()
c := db.C("user")
err := c.Find(nil).All(&results)

次のコードで「結果」とint配列を送信したい

GetTemplate("list").Execute(w,???????)

db の結果しかない場合は、次のように使用できます。

GetTemplate("list").Execute(w,results)

テンプレートでは {{.Name}} などにアクセスできます (Name は []User の構造体フィールドです)。

これらのデータを渡す方法とテンプレートでアクセスする方法を教えてください。

4

2 に答える 2

23

単一の値のみを渡すことができますが、その値は、構造体、マップ、またはスライスなど、複数の値の合成値である場合があります。したがって、テンプレート用の複数のデータを 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 が値を提供するチャネルを渡すこともできます。

さらに別の解決策は、呼び出されたときに値を返すカスタム関数を登録することです。

于 2016-02-05T12:26:51.547 に答える