【问题标题】:Get the last element of an array within a struct in a Golang template [duplicate]获取Golang模板中结构内数组的最后一个元素[重复]
【发布时间】:2021-08-22 17:14:33
【问题描述】:

我正在为一个学校项目在 Go 中构建一个简单的论坛,并且我正在将一个数据结构传递给一个模板以显示子论坛中的所有帖子。我传递给模板的数据是这样的:

type Data struct {
   ID    int       // ID of the subforum
   User  User      // logged-in user
   Posts []Post    // all the posts of the subforum
}

Data 结构中的 Post 结构是这样的:

type Post struct {
    ID         int
    Title      string
    Content    string
    Date       time.Time
    [...]
    Author     User
    Comments   []Comment
}

Comment 结构类似于 Post 结构。当我显示所有帖子的列表时,我还想显示回复数量和最后回复的日期/时间。

在我的 HTML 模板中,我可以得到这样的回复数:

{{range .Posts}}

    <p>Replies: {{ len .Comments }}</p>

{{ end }}

...但我似乎无法理解获取 Comments 数组的最后一个元素的日期。我知道您可以使用 index 关键字和值 '0' 获取第一个元素,但我不能在模板中使用 (len .Comments -1)获取最后一个元素,因为 '-' 是禁止字符。我可能会创建第二个函数,让我的 cmets 按 SQLite 数据库中的降序排序,但我想知道是否有一种简单的方法来处理 Go 模板中的索引。

谢谢。

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    Go 模板没有一种干净的方法来执行此操作,但这是一种解决方法here。一个更简单的解决方法是在将结构传递给模板之前将最后一项添加到结构中。您正在做的是将复杂的逻辑从模板中移出(模板本来就不是为此而设计的)并进入 Go 代码。

    type Post struct {
        ....
        Comments   []Comment
        LastComment Comment
    }
    

    然后在你的模板中,就这样做

    {{ .LastComment }}
    

    【讨论】:

      【解决方案2】:

      您可以在模板中使用自定义函数来获取最后一个元素:

      fmap := template.FuncMap{
          "lastElem": func(comments []Comment) Comment { 
              return comments[len(comments)-1]
          },
      }
      
      tmpl, err := template.New("tmpl").Funcs(fmap).Parse(tpl)
      

      然后在你的模板中使用它:

      {{range .Posts}}
      
          <p>Replies: {{ lastElem .Comments }}</p>
      
      {{ end }}
      

      【讨论】:

        猜你喜欢
        • 2018-08-03
        • 2019-05-12
        • 2022-01-26
        • 2012-06-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        相关资源
        最近更新 更多