在Go模板范围循环中,每次循环都会在循环外部声明的变量重置吗?

我正在尝试使用在Go模板范围循环之外声明的变量,以查看先前的帖子是否与当前帖子在同一天发生。这是一个简化的示例。

哪里.Posts有每个都有a .Content和a 的post struct数组.Date

{{ $prevDate := "" }}

{{ range $post := .Posts }}

{{ if ne $prevDate $post.Date }}

<div class="post-date">Posts dated: {{ $post.Date }}</div>

{{ end }}

<div class="post-content">{{ $post.Content }}</div>

{{ $prevDate := $post.Date }}

{{ end }}

问题是$prevDate似乎""在循环的每次迭代开始时重置为。

谁能帮助我理解为什么$prevDate每次迭代都会重置的值,并且可能提出一种方法来完成我在此处尝试执行的操作?

回答:

Go

1.11将支持通过Assignment修改模板变量。这将是有效的代码:

{{ $v := "init" }}

{{ if true }}

{{ $v = "changed" }}

{{ end }}

v: {{ $v }} {{/* "changed" */}}

Go 1.11之前的原始答案如下:


变量不会重置。基本上发生的是$prevDate在循环内重新声明变量。但这仅在重新声明之后和的结束{{end}}标记之前{{range}}。因此,在下一个循环迭代到来时,您只会看到未更改的“外部”变量(因为您创建了一个新变量)。

您无法更改创建的模板变量的值。

例如,您可以使用以下range格式:

{{ range $index, $post := .Posts }}

和…

回答:

并且您可以为模板注册一个函数(请参阅参考资料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}}

回答:

该解决方案是模拟的,但更简单:在您的方法中添加一个方法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}}

以上是 在Go模板范围循环中,每次循环都会在循环外部声明的变量重置吗? 的全部内容, 来源链接: utcz.com/qa/418590.html

回到顶部