按时间排列,按年份打印

时间:2015-05-17 07:43:18

标签: templates go

目前,我正在使用https://play.golang.org/p/P1-sAo5Qy8

打印帖子归档日期

虽然我认为按年打印更好:

2009

2005

如何在Posts PostDate上长期反转,以打印我想要的分组?它可以在模板中完成吗?

1 个答案:

答案 0 :(得分:2)

Posts结构上实施sort.Interface,然后按相反的顺序对其进行排序。

type Posts struct {
    Posts []Post
}

func (p Posts) Len() int {
    return len(p.Posts)
}

func (p Posts) Less(i, j int) bool {
    return p.Posts[i].PostDate.Before(p.Posts[j].PostDate)
}

func (p Posts) Swap(i, j int) {
    p.Posts[i], p.Posts[j] = p.Posts[j], p.Posts[i]
}

posts := Posts{p}
sort.Sort(sort.Reverse(posts))

这将按照您想要的顺序为您提供帖子。

接下来,你必须使用一个闭包来实现一个func,这样你就可以检查当前年份是否与上一篇文章的年份相同,以便按年份进行分组。如果是,则仅输出帖子,否则输出带有年份的标题,然后输出帖子。

currentYear := "1900"
funcMap := template.FuncMap{
    "newYear": func(t string) bool {
        if t == currentYear {
            return false
        } else {
            currentYear = t
            return true
        }
    },
}

并使用它:

{{ range . }}{{ if newYear (.PostDate.Format "2006") }}<li><h1>{{ .PostDate.Format "2006" }}</h1></li>{{ end }}

查看工作示例on the Playground