猿问

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

给定下面的结构,我想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

}


白猪掌柜的
浏览 158回答 1
1回答

慕斯709654

无论管道的值是什么(.在模板中用点表示),您都可以使用$来引用您传递给 的数据值Template.Execute()。该{{range}}操作迭代元素并将管道 ( .) 设置为当前项目,因此.始终表示当前项目,$绝对是指传递给 的“顶级”数据Template.Execute()。这记录在text/template:当执行开始时,$ 被设置为传递给 Execute 的数据参数,即 dot 的起始值。另请注意,您必须导出结构字段才能在模板中使用。因此,将您的MyPageData类型更改为:type MyPageData struct {&nbsp; &nbsp; Field1 []Foo&nbsp; &nbsp; Field2 map[string]Bar}另请注意,您可以使用.运算符简单地访问地图元素。因此,您也可以在操作中访问Field2与"myKey"键关联的映射的值,如下所示{{range}}:{{$.Field2.myKey}}看这个简单的例子:type MyPageData struct {&nbsp; &nbsp; Field1 []Foo&nbsp; &nbsp; Field2 map[string]Bar}type Foo struct {&nbsp; &nbsp; Name string}type Bar struct {&nbsp; &nbsp; Name string}func main() {&nbsp; &nbsp; t := template.Must(template.New("").Parse(templ))&nbsp; &nbsp; mpd := MyPageData{&nbsp; &nbsp; &nbsp; &nbsp; Field1: []Foo{{"First"}, {"Second"}},&nbsp; &nbsp; &nbsp; &nbsp; Field2: map[string]Bar{"myKey": {"MyValue"}},&nbsp; &nbsp; }&nbsp; &nbsp; 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}}
随时随地看视频慕课网APP

相关分类

Go
我要回答