为了账号安全,请及时绑定邮箱和手机立即绑定

Go html模板访问范围内的结构字段

Go html模板访问范围内的结构字段

Go
白猪掌柜的 2021-12-07 09:31:00
给定下面的结构,我想field2在迭代field1html 中的数据时访问。我该怎么做呢?var MyPageData struct {      field1 []Foo      field2 map[string]Bar}我试过:内部处理程序功能:err := myPageTemplate.Execute(w,MyPageData{ field1: field1Slice, field2 : myMapData})模板:     {{ range $index, $fooInstance := .field1}}         <tr>            <td>{{$fooInstance.Name}}</td> //This prints the Name value            <td>{{ index .$field2 "myKey".Name }}</td>我如何访问field2上面并指定一个键值来检索Bar实例?更新添加 Foo 和 Bar 结构type Foo2 struct {    Name string    Id  int }type Foo struct {    Name string    element Foo2}type Bar struct {    Name string}
查看完整描述

1 回答

?
慕斯709654

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}}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信