Durchlaufen der Karte in der Vorlage

89

Ich versuche, eine Liste der Fitnesskurse (Yoga, Pilates usw.) anzuzeigen. Für jeden Klassentyp gibt es mehrere Klassen, daher möchte ich alle Yoga-Klassen und alle Pilates-Klassen usw. gruppieren.

Ich habe diese Funktion gemacht, um ein Slice zu nehmen und eine Karte davon zu machen

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
}

Das Problem ist nun, wie ich es durchlaufen kann. Laut http://golang.org/pkg/text/template/ müssen Sie im .KeyFormat darauf zugreifen . Ich kenne die Schlüssel nicht (es sei denn, ich habe auch ein Slice übergeben von Schlüsseln in die Vorlage). Wie entpacke ich diese Karte in meiner Ansicht?

Alles was ich derzeit habe ist

{{ . }} 

welches etwas anzeigt wie:

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 leebrooks0@gmail.com 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 
Lee
quelle

Antworten:

164

Überprüfen Sie den Abschnitt Variablen in den Go-Vorlagendokumenten. Ein Bereich kann zwei Variablen deklarieren, die durch ein Komma getrennt sind. Folgendes sollte funktionieren:

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

Wie Herman betonte, können Sie den Index und das Element aus jeder Iteration abrufen.

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

Arbeitsbeispiel:

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

}

Ausgabe:

Pilates
3
6
9

Yoga
15
51

Spielplatz: http://play.golang.org/p/4ISxcFKG7v

ANisus
quelle
Hey @ANisus, ich muss json über eine Vorlage wie unten generieren, aber es gibt auch zusätzliche Kommas wie im Adressarray im angegebenen Beispiel. Ausgabe `` `{" name ":" Mus "," adresses ": [{" address ":" A "}, {" address ":" B "},]}` `` Link zum Beispielcode play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem
1
@MohammadMustaqeem Sie können den Index jeder Iteration überprüfen und bei der ersten Iteration kein Komma hinzufügen. Siehe Beispiel: play.golang.org/p/5544hc_0_g8 . Sei einfach vorsichtig. Das Rendern von JSON mit Vorlagen führt zu Escape-Problemen. Siehe die von mir hinzugefügte "C & D" -Adresse.
ANisus
Vielen Dank. Ich habe das Problem behoben, indem ich "Text / Vorlage" anstelle von "HTML / Vorlage" importiert habe. play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem
1
@MohammadMustaqeem Leider erhalten Sie jetzt möglicherweise ungültiges JSON oder noch schlimmer injiziertes JSON: play.golang.org/p/kd9bM_rpwyg . Die Verwendung der Vorlage zum Generieren von json ist unklug. Wenn Sie dies jedoch tun müssen, maskieren Sie die JSON-Werte mit Funktionen wie js (auch in diesem Beispiel).
ANisus