为了账号安全,请及时绑定邮箱和手机立即绑定

获取 Golang 模板中结构中数组的最后一个元素

获取 Golang 模板中结构中数组的最后一个元素

Go
桃花长相依 2022-09-05 10:43:40
我正在 Go 中为学校项目构建一个简单的论坛,并且我正在将数据结构传递给模板以显示子论坛中的所有帖子。我传递给模板的数据是这样的:type Data struct {   ID    int       // ID of the subforum   User  User      // logged-in user   Posts []Post    // all the posts of the subforum}数据结构中的 Post 结构如下所示:type Post struct {    ID         int    Title      string    Content    string    Date       time.Time    [...]    Author     User    Comments   []Comment}注释结构类似于 Post 结构。当我显示所有帖子的列表时,我还想显示回复的数量和上次回复的日期/时间。在我的HTML模板中,我可以得到这样的回复数量:{{range .Posts}}    <p>Replies: {{ len .Comments }}</p>{{ end }}...但我似乎无法弄清楚注释数组中最后一个元素的日期。我知道你可以得到第一个元素与索引关键字和值'0',但我不能使用(len .注释 -1) 在模板中获取最后一个元素,因为 '-' 是禁止的字符。我可能会创建第二个函数来使我的注释按SQLite数据库的降序排序,但我想知道是否有一种简单的方法来处理Go模板中的索引。
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


type Post struct {

    ....

    Comments   []Comment

    LastComment Comment

}

然后在您的模板中,只需执行


{{ .LastComment }}


查看完整回答
反对 回复 2022-09-05
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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


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


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 885 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信