猿问

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

我正在 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模板中的索引。


桃花长相依
浏览 957回答 2
2回答

阿波罗的战车

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

开心每一天1111

您可以使用模板中的自定义函数来获取最后一个元素:fmap := template.FuncMap{&nbsp; &nbsp; "lastElem": func(comments []Comment) Comment {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return comments[len(comments)-1]&nbsp; &nbsp; },}tmpl, err := template.New("tmpl").Funcs(fmap).Parse(tpl)然后在模板中将其用作:{{range .Posts}}&nbsp; &nbsp; <p>Replies: {{ lastElem .Comments }}</p>{{ end }}
随时随地看视频慕课网APP

相关分类

Go
我要回答