Şablonda harita üzerinde yineleme


94

Spor dersleri (Yoga, Pilates vb.) Listesini görüntülemeye çalışıyorum. Her sınıf türü için birkaç sınıf var, bu yüzden tüm Yoga derslerini ve tüm Pilates derslerini vb. Gruplamak istiyorum.

Bu işlevi bir dilim alıp bir haritasını çıkarmak için yaptım

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
}

Sorun şu ki, http://golang.org/pkg/text/template/ 'e göre onu nasıl yineleyebilirim, ona .Keyformatta erişmeniz gerekiyor , anahtarları bilmiyorum (bir dilim de geçmediysem şablona anahtarlar). Benim görüşüme göre bu haritayı nasıl açacağım.

Şu anda sahip olduğum tek şey

{{ . }} 

aşağıdaki gibi bir şey görüntüler:

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 

Yanıtlar:


170

Go şablon belgelerinde Değişkenler bölümünü kontrol edin . Bir aralık, virgülle ayrılmış iki değişken tanımlayabilir. Aşağıdakiler çalışmalıdır:

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

47

Herman'ın işaret ettiği gibi, her bir yinelemeden indeksi ve öğeyi alabilirsiniz.

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

Çalışma örneği:

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

}

Çıktı:

Pilates
3
6
9

Yoga
15
51

Oyun alanı: http://play.golang.org/p/4ISxcFKG7v


Hey @ANisus, aşağıdaki gibi bir şablon aracılığıyla json oluşturma zorunluluğum var ancak verilen örnekteki adres dizisindeki gibi ekstra virgül de var Çıktı `` {"ad": "Mus", "adresler": [{"adres ":" A "}, {" adres ":" B "},]}` `Örnek kodun bağlantısı play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem Her yinelemenin dizinini kontrol edebilir ve ilk yinelemede virgül eklemeyebilirsiniz. Örneğe bakın: play.golang.org/p/5544hc_0_g8 . Sadece dikkatli ol. JSON'u şablonlarla oluşturmak, çıkış sorunlarına neden olur. Eklediğim "C&D" adresine bakın.
ANisus

Teşekkürler. Çıkış sorununu "html / şablon" yerine "metin / şablon" içe aktararak çözdüm. play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem Maalesef artık geçersiz JSON veya daha kötüsü enjekte edilmiş JSON alabilirsiniz: play.golang.org/p/kd9bM_rpwyg . Json oluşturmak için şablon kullanmak akıllıca değildir, ancak gerekiyorsa, js gibi işlevlerle JSON değerlerinden kaçın (bu örnekte de).
ANisus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.