web-dev-qa-db-ja.com

構造体のスライスの代わりに構造体のスライスを範囲指定する方法

Go HTMLテンプレートを少し試してみたところ、テンプレート内のオブジェクトをループするために見つけたすべての例は、次の例のように、スライスの構造体をテンプレートに渡していました。

type UserList struct {
    Id   []int
    Name []string
}

var templates = template.Must(template.ParseFiles("main.html"))

func rootHandler(w http.ResponseWriter, r *http.Request) {
    users := UserList{
        Id:   []int{0, 1, 2, 3, 4, 5, 6, 7},
        Name: []string{"user0", "user1", "user2", "user3", "user4"},
    }
    templates.ExecuteTemplate(w, "main", &users)
}

「メイン」テンプレートは次のとおりです。

{{define "main"}}
    {{range .Name}}
        {{.}}
    {{end}}
{{end}}

これは機能しますが、.Nameプロパティのみに範囲を設定している場合、対応する名前のすぐ隣に各IDを表示する方法がわかりません。各ユーザーをオブジェクトとして扱い、プロパティを表示するときにグループ化する方が理にかなっています。

したがって、私の質問:

構造体のスライスをテンプレートに渡したい場合はどうなりますか?これを機能させる構文は何ですか?公式のhtml /テンプレートドキュメントでその方法を見つけたり、理解したりしていません。次のように見えるものを想像しました。

type User struct {
    Id   int
    Name string
}
type UserList []User
var myuserlist UserList = ...

そして、このように見えるテンプレート:(ここでの構文は意図的に間違っています、それは単に理解されるためです)

{{define "main"}}
    {{for each User from myuserlist as myuser}}
        {{myuser.Id}}
        {{myuser.Name}}
    {{end}}
{{end}}
14

使用する:

{{range .}}
    {{.Id}}
    {{.Name}}
{{end}}

テンプレート用。
例を示します: http://play.golang.org/p/A4BPJOcfpB
これを適切に使用する方法を確認するには、パッケージの概要の「ドット」の詳細を読む必要があります。 http://golang.org/pkg/text/template/#pkg-overview (パイプラインパーツをチェックアウト)

36
nvcnvn

私にはコメントする担当者がいませんが、@ ROMANIA_engineerに回答するために、elithrarによって引用されたソースは廃止されました。

この本はまもなくAPressから発行されるため、削除されました。 Goを使用したネットワークプログラミング:ネットワークの使用とセキュリティ保護のための基本的なスキルをご覧ください

2