Templates 访问golang模板内的循环外值';s环
我有这个结构:Templates 访问golang模板内的循环外值';s环,templates,go,Templates,Go,我有这个结构: type Site struct { Name string Pages []int } 我将站点的一个实例传递给 如果我想写一个所有页面的列表,我会 {{range .Pages}} <li><a href="{{.}}">{{.}}</a></li> {{end}} {{range.Pages} {{end} 现在,在循环中使用Name字段(例如将href更改为Name/page)最简单的方法是什
type Site struct {
Name string
Pages []int
}
我将站点的一个实例传递给
如果我想写一个所有页面的列表,我会
{{range .Pages}}
<li><a href="{{.}}">{{.}}</a></li>
{{end}}
{{range.Pages}
{{end}
现在,在循环中使用Name
字段(例如将href
更改为Name/page
)最简单的方法是什么
请注意,基于外部对象是传递给模板的全局对象这一事实的解决方案是可以的。看起来没有比显式声明外部对象(或其属性)的变量更简单的解决方案了:
{{$out:=.}
{{range.Pages}
{{end}
编辑:这个答案不再正确,请看chowey的答案。关于:
{{$name := .Name}}
{{range $page := .Pages}}
<li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
{{end}}
您应该知道传递到模板中的变量可用作$
{{range .Pages}}
<li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
{{end}}
{{range.Pages}
{{end}
(参见“变量”下的文档)第一个解决方案与我的解决方案大致相同。第二个不合适:名称不是页面的名称,而是站点的名称。这并没有什么可笑的。我以前做过这个。言行一致。清晰>简洁。@JimPaek传递到模板的对象没有快捷方式?对不起,我想我错了。您可以这样做:range$index,$page:=.Pages,然后我相信“.”仍然是模板的原始管道。编辑:待编辑tested@JimPaek它不起作用:您可以像这样声明变量,但是{.}
仍然是迭代值(即它等于$page
),并且{.Name}
因此会产生一个模板错误。@bfrederi注意,OP也是这里的答案;)如果我有一个全局变量123,并且在某个范围内,我试图使用该范围的id作为全局变量,该怎么办?太令人困惑了。。。但我怎么能做到这一点呢?我尝试了以下方法,但效果不太好。。。
type Site struct {
Pages map[string]string
}
{{range $page, $name := .Pages}}
<li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
{{end}}
{{range .Pages}}
<li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
{{end}}