您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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 2022/1/1 18:17:57 有595人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶