web-dev-qa-db-fra.com

Comment s'étendre sur une tranche de structures au lieu d'une structure de tranches

Après avoir joué un peu avec les modèles Go HTML, tous les exemples que j'ai trouvés pour boucler sur des objets dans des modèles transmettaient des structures de tranches au modèle, un peu comme dans cet exemple:

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)
}

le modèle "principal" étant:

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

Cela fonctionne, mais je ne comprends pas comment je suis censé afficher chaque ID juste à côté de son nom correspondant si je me trouve sur la propriété .Name uniquement. Je trouverais plus logique de traiter chaque utilisateur comme un objet pour regrouper ses propriétés lors de l'affichage.

Ainsi ma question:

Et si je voulais passer une tranche de structs au template? Quelle serait la syntaxe pour faire fonctionner cela? Je n'ai pas trouvé ni compris comment le faire dans le document officiel html/template. J'ai imaginé quelque chose ressemblant à distance à ceci:

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

et un modèle ressemblant un peu à ceci: (la syntaxe ici est délibérément erronée, c'est juste pour se faire comprendre)

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

Utilisation:

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

pour le modèle.
Voici un exemple: http://play.golang.org/p/A4BPJOcfpB
Vous devez en savoir plus sur le "point" dans l'aperçu du package pour voir comment l'utiliser correctement. http://golang.org/pkg/text/template/#pkg-overview (consultez la partie Pipelines)

36
nvcnvn

Je n'ai pas de représentant pour commenter, mais pour répondre à @ROMANIA_engineer, la source citée par elithrar a été retirée, pour tous ceux qui recherchent toujours cette référence:

Ce livre a été supprimé car il sera prochainement publié par APress. Veuillez consulter Programmation réseau avec Go: compétences essentielles pour l'utilisation et la sécurisation des réseaux

2
Jonathan Bérubé