テンプレートのマップを反復する


91

ジムクラス(ヨガ、ピラティスなど)のリストを表示しようとしています。クラスの種類ごとにいくつかのクラスがあるので、すべてのヨガクラス、すべてのピラティスクラスなどをグループ化したいと思います。

この機能を作ってスライスを切り取り、地図を作成しました

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
}

問題は、どのようにそれを通してI反復は、に応じてすることができ、今で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 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 

回答:


166

Goテンプレートドキュメントの変数セクションを確認してください。範囲は、コンマで区切られた2つの変数を宣言できます。以下はうまくいくはずです:

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

46

ハーマンが指摘したように、各反復からインデックスと要素を取得できます。

{{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


@ANisusさん、以下のようなテンプレートを使用してjsonを生成する必要がありますが、指定された例のアドレス配列のように余分なコンマもあります。出力 `` `{" name ":" Mus "、" adresses ":[{" address ":" A "}、{" address ":" B "}、]}` ``サンプルコードのリンクplay.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem各反復のインデックスを確認できます。最初の反復でコンマを追加することはできません。例を参照してください:play.golang.org/p/5544hc_0_g8 。注意してください。テンプレートを使用してJSONをレンダリングすると、エスケープの問題が発生します。追加した「C&D」アドレスを参照してください。
ANisus

ありがとう。「html / template」の代わりに「text / template」をインポートすることで、エスケープの問題を解決しました。play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem残念ながら、無効なJSONを取得したり、さらに悪いことに、JSONを挿入したりする可能性があります:play.golang.org/p/kd9bM_rpwyg。jsonの生成にテンプレートを使用することは賢明ではありませんが、必要な場合は、jsなどの関数を使用してJSON値をエスケープします(この例でも)。
ANisus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.