Note: Go 1.11 将支持通过赋值修改模板变量 https://tip.golang.org/doc/go1.11#text/template。这将是有效的代码:
{{ $v := "init" }}
{{ if true }}
{{ $v = "changed" }}
{{ end }}
v: {{ $v }} {{/* "changed" */}}
Go 1.11 之前的原始答案如下:
变量不会重置。基本上发生的事情是你重新声明$prevDate
循环内的变量。但它仅在重新声明之后和结束之前的范围内{{end}}
的标签{{range}}
。因此,当循环的下一次迭代到来时,您只能看到未更改的“外部”变量(因为您创建了一个新变量)。
您无法更改您创建的模板变量的值。
例如,您可以使用以下命令range
form:
{{ range $index, $post := .Posts }}
And...
解决方案#1:使用注册函数
您可以为模板注册一个函数(请参阅template.Funcs() http://golang.org/pkg/text/template/#Template.Funcs)您可以将$index
它将返回前一个元素的日期字段(位于$index -1
).
它看起来像这样:
func PrevDate(i int) string {
if i == 0 {
return ""
}
return posts[i-1].Date
}
// Registering it:
var yourTempl = template.Must(template.New("").
Funcs(map[string]interface{}{"PrevDate": PrevDate}).
Parse(yourStringTemplate))
从你的模板中你可以这样称呼它:
{{range $index, $post := .Posts}}
{{$prevDate := PrevDate $index}}
{{end}}
解决方案#2:使用帖子方法
这个解决方案是模拟的,但更简单:向您的Posts
你可以直接调用它。无需注册函数。
例如:
type Post struct {
// Your Post type
Date string
}
type Posts []Post
func (p *Posts) PrevDate(i int) string {
if i == 0 {
return ""
}
return (*p)[i-1].Date
}
从你的模板中你可以这样称呼它:
{{range $index, $post := .Posts}}
{{$prevDate := $.Posts.PrevDate $index}}
{{end}}