2014-01-23 3 views
55

Я пытаюсь отобразить список занятий в тренажерном зале (йога, пилатес и т. Д.). Для каждого типа класса существует несколько классов, поэтому я хочу сгруппировать все классы йоги и все классы Пилатеса и так далее.Итерация через карту в шаблоне

Я сделал эту функцию, чтобы взять кусочек и сделать карту его

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 
} 

Проблема в том, как теперь я могу итерацию через него, согласно http://golang.org/pkg/text/template/, вы должны получить доступ к нему в формате .Key, я не знаю ключей (если я также не передал кусок ключей в шаблон). Как распаковать эту карту на мой взгляд.

Все, что я в настоящее время

{{ . }} 

, который показывает что-то вроде:

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 

ответ

100

Проверьте Variables section в документации шаблона Go. Диапазон может объявлять две переменные, разделенные запятой. Должно работать следующее:

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

Как указал Герман, вы можете получить индекс и элемент с каждой итерации.

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

Рабочий пример:

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

} 

Выход:

Pilates 
3 
6 
9 

Yoga 
15 
51 

площадка: http://play.golang.org/p/4ISxcFKG7v

+0

Большое спасибо за код примера – Lee

+1

@lee Добро пожаловать! :) Думал, что это может быть полезно, даже если Герман уже дал вам правильный ответ. – ANisus

Смежные вопросы