Iterazione attraverso la mappa nel modello


91

Sto cercando di visualizzare un elenco di corsi di ginnastica (Yoga, Pilates, ecc.). Per ogni tipo di lezione ci sono diverse classi, quindi voglio raggruppare tutte le lezioni di Yoga e tutte le lezioni di Pilates e così via.

Ho creato questa funzione per prendere una fetta e farne una mappa

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
}

Il problema ora è come posso iterarlo, secondo http://golang.org/pkg/text/template/ , devi accedervi in .Keyformato, non conosco le chiavi (a meno che non abbia passato anche uno slice di chiavi nel modello). Come faccio a decomprimere questa mappa nella mia visualizzazione.

Tutto quello che ho attualmente è

{{ . }} 

che mostra qualcosa come:

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 

Risposte:


166

Controlla la sezione Variabili nei documenti del modello Go. Un intervallo può dichiarare due variabili, separate da una virgola. Quanto segue dovrebbe funzionare:

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

46

Come ha sottolineato Herman, puoi ottenere l'indice e l'elemento da ogni iterazione.

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

Esempio di lavoro:

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

}

Produzione:

Pilates
3
6
9

Yoga
15
51

Parco giochi: http://play.golang.org/p/4ISxcFKG7v


Ehi @ANisus, ho un requisito per generare json tramite un modello come di seguito, ma ha anche virgole extra come nell'array degli indirizzi nell'esempio fornito. Output "` `{" name ":" Mus "," adresses ": [{" address ":" A "}, {" address ":" B "},]}` `Link del codice di esempio play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem Puoi controllare l'indice di ogni iterazione e non aggiungere una virgola alla prima iterazione. Vedi esempio: play.golang.org/p/5544hc_0_g8 . Solo stai attento. Il rendering di JSON con modelli causerà problemi di escape. Vedi l'indirizzo "C&D" che ho aggiunto.
ANisus

Grazie. Ho risolto il problema di escape importando "text / template" invece di "html / template". play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem Sfortunatamente ora potresti ottenere un JSON non valido o, peggio ancora, JSON iniettato: play.golang.org/p/kd9bM_rpwyg . L'uso del modello per la generazione di json non è saggio, ma se necessario, esegui l'escape dei valori JSON con funzioni come js (anche in questo esempio).
ANisus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.