web-dev-qa-db-fra.com

Itération sur la carte dans un modèle

J'essaie d'afficher une liste de cours de gymnastique (yoga, pilates, etc.). Pour chaque type de classe, il existe plusieurs classes. Je souhaite donc regrouper toutes les classes de yoga, toutes les classes de Pilates, etc.

J'ai fait cette fonction pour prendre une tranche et en faire une carte

func groupClasses(classes []entities.Class) map[string][]entities.Class {
    classMap := make(map[string][]entities.Class)
    for _, class := range classes {
        classMap[class.ClassType.Name] = append(classMap[class.ClassType.Name], class)
    }
    return classMap
}

Le problème est maintenant comment puis-je le parcourir, selon http://golang.org/pkg/text/template/ , vous devez y accéder dans .Key _ format, je ne connais pas les clés (sauf si j'ai également passé une tranche de clés dans le modèle). Comment puis-je décompresser cette carte dans ma vue.

Tout ce que j'ai actuellement est

{{ . }} 

qui affiche quelque chose comme:

map[Pilates:[{102 PILATES ~/mobifit/video/ocen.mpg 169 40 2014-05-03 23:12:12 +0000 UTC 2014-05-03 23:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC {PILATES Pilates 1 2014-01-22 21:46:16 +0000 UTC} {1 [email protected] password SUPERADMIN Lee Brooks {Male true} {1990-07-11 00:00:00 +0000 UTC true} {1.85 true} {88 true} 2014-01-22 21:46:16 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false}} [{1 Mat 2014-01-22 21:46:16 +0000 UTC}]} {70 PILATES ~/mobifit/video/ocen.mpg 119 66 2014-03-31 15:12:12 +0000 UTC 2014-03-31 15:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC 
77
Lee

Vérifiez la section Variables dans la documentation du modèle Aller. Une plage peut déclarer deux variables, séparées par une virgule. Ce qui suit devrait fonctionner:

{{ range $key, $value := . }}
   <li><strong>{{ $key }}</strong>: {{ $value }}</li>
{{ end }}
145
Herman Schaaf

Comme Herman l'a souligné, vous pouvez obtenir l'index et l'élément de chaque itération.

{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}

Exemple de travail:

package main

import (
    "html/template"
    "os"
)

type EntetiesClass struct {
    Name string
    Value int32
}

// In the template, we use rangeStruct to turn our struct values
// into a slice we can iterate over
var htmlTemplate = `{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}`

func main() {
    data := map[string][]EntetiesClass{
        "Yoga": {{"Yoga", 15}, {"Yoga", 51}},
        "Pilates": {{"Pilates", 3}, {"Pilates", 6}, {"Pilates", 9}},
    }

    t := template.New("t")
    t, err := t.Parse(htmlTemplate)
    if err != nil {
        panic(err)
    }

    err = t.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }

}

Sortie:

Pilates
3
6
9

Yoga
15
51

Aire de jeux: http://play.golang.org/p/4ISxcFKG7v

39
ANisus