1 回答
TA贡献1840条经验 获得超5个赞
无论管道的值是什么(.在模板中用点表示),您都可以使用$来引用您传递给 的数据值Template.Execute()。该{{range}}操作迭代元素并将管道 ( .) 设置为当前项目,因此.始终表示当前项目,$绝对是指传递给 的“顶级”数据Template.Execute()。
这记录在text/template:
当执行开始时,$ 被设置为传递给 Execute 的数据参数,即 dot 的起始值。
另请注意,您必须导出结构字段才能在模板中使用。因此,将您的MyPageData类型更改为:
type MyPageData struct {
Field1 []Foo
Field2 map[string]Bar
}
另请注意,您可以使用.运算符简单地访问地图元素。因此,您也可以在操作中访问Field2与"myKey"键关联的映射的值,如下所示{{range}}:
{{$.Field2.myKey}}
看这个简单的例子:
type MyPageData struct {
Field1 []Foo
Field2 map[string]Bar
}
type Foo struct {
Name string
}
type Bar struct {
Name string
}
func main() {
t := template.Must(template.New("").Parse(templ))
mpd := MyPageData{
Field1: []Foo{{"First"}, {"Second"}},
Field2: map[string]Bar{"myKey": {"MyValue"}},
}
t.Execute(os.Stdout, mpd)
}
const templ = `{{range $idx, $foo := .Field1}}{{$.Field2.myKey}} {{$idx}} - {{$foo.Name}}
{{end}}`
输出(在Go Playground上试试):
{MyValue} 0 - First
{MyValue} 1 - Second
另请注意, insdie{{range}}而不是$foo.Name您可以简单地{{.Name}}用作点.表示$foo当前项目。
如果要Field2使用动态键查找值,则确实需要使用该{{index}}操作。例如,如果您希望与键关联的值是$foo.Name:
{{index $.Field2 $foo.Name}}
或简短:
{{index $.Field2 .Name}}
接下来,如果与键关联的值是一个结构体,并且您只需要这个结构体的一个字段,比如说Id,您可以使用括号:
{{(index $.Field2 .Name).Id}}
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报