注意: Go
1.11将支持通过Assignment修改模板变量。这将是有效的代码:
{{ $v := "init" }}{{ if true }} {{ $v = "changed" }}{{ end }}v: {{ $v }} {{}}Go 1.11之前的原始答案如下:
变量不会重置。基本上发生的是
$prevDate在循环内重新声明变量。但这仅在重新声明之后和的结束
{{end}}标记之前{{range}}。因此,在下一个循环迭代到来时,您只会看到未更改的“外部”变量(因为您创建了一个新变量)。您无法更改创建的模板变量的值。
例如,您可以使用以下
range格式:
{{ range $index, $post := .Posts }}和…
解决方案#1:具有注册功能
并且您可以为模板注册一个函数(请参阅参考资料
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 []Postfunc (p *Posts) PrevDate(i int) string { if i == 0 { return "" } return (*p)[i-1].Date}在模板中,您可以这样称呼它:
{{range $index, $post := .Posts}} {{$prevDate := $.Posts.PrevDate $index}}{{end}}


