遍历模板中的地图


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
}

现在的问题是,根据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 

Answers:


166

检查Go模板文档中的Variables部分。范围可以声明两个变量,以逗号分隔。以下应该工作:

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

46

正如Herman指出的那样,您可以从每次迭代中获取索引和元素。

{{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“},{”地址“:” B“},]}```示例代码的链接play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem您可以检查每次迭代的索引,而不必在第一次迭代时添加逗号。参见示例:play.golang.org/p/5544hc_0_g8 。请注意。使用模板呈现JSON将导致转义问题。请参阅我添加的“ C&D”地址。
阿尼斯(Anisus)

谢谢。我已经通过导入“文本/模板”而不是“ html /模板”解决了转义问题。play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem不幸的是,您现在可能会得到无效的JSON,或更糟糕的是,注入了JSON:play.golang.org/p/kd9bM_rpwyg。使用模板生成json是不明智的,但如果必须这样做,请使用js之类的函数对JSON值进行转义(也在本示例中)。
阿尼斯(Anisus)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.