【问题标题】:Iterating through map in template遍历模板中的地图
【发布时间】:2014-02-13 16:01:00
【问题描述】:

我正在尝试显示健身课程列表(瑜伽、普拉提等)。对于每种课程类型都有几个课程,所以我想将所有瑜伽课程和所有普拉提课程等分组。

我做了这个函数来截取切片并制作地图

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的格式访问它,我不知道keys(除非我也传入了一个keys切片到模板中)。如何在我的视图中解压缩此地图。

我现在只有

{{ . }} 

显示如下内容:

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 

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    查看 Go 模板文档中的 Variables section。一个范围可以声明两个变量,用逗号分隔。以下应该有效:

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

    【讨论】:

      【解决方案2】:

      正如 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", "addresses": [{"address": "A"},{"address": "B"},]} ``` 示例代码链接play.golang.org/p/nD08y0noPHv
      • @MohammadMustaqeem 您可以检查每次迭代的索引,而不是在第一次迭代时添加逗号。参见示例:play.golang.org/p/5544hc_0_g8。小心点。使用模板渲染 JSON 会导致转义问题。查看我添加的“C&D”地址。
      • 谢谢。我通过导入“text/template”而不是“html/template”解决了转义问题。 play.golang.org/p/PXTNZGWx7Yi
      • @MohammadMustaqeem 不幸的是,您现在可能会得到无效的 JSON,或者更糟糕的是,注入的 JSON:play.golang.org/p/kd9bM_rpwyg。使用模板生成 json 是不明智的,但如果必须,请使用 js 等函数(也在此示例中)转义 JSON 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2022-12-11
      • 2011-03-23
      • 2013-05-06
      • 1970-01-01
      相关资源
      最近更新 更多