要访问由其名称给出的结构的字段值,您需要来自reflect https://golang.org/pkg/reflect/包裹。可以这样做:
v := AdFile{ID:1, Title: "T1"} // A struct value
name := "ID" // field name
fieldValue := reflect.ValueOf(v).FieldByName(name).Interface()
由于这是 Go 代码,因此您无法将其嵌入模板中。但是您可以使用以下方法注册自定义函数Template.Funcs() https://golang.org/pkg/text/template/#Template.Funcs可以从模板调用的方法。
因此,让我们这样做:将此功能包装到一个函数中,并按名称注册它"Field"
所以我们可以从我们的模板中调用它。
func main() {
t := template.Must(template.New("").Funcs(template.FuncMap{
"Field": func(v interface{}, name string) interface{} {
return reflect.ValueOf(v).FieldByName(name).Interface()
},
}).Parse(templ))
m := map[string]interface{}{
"columns": []string{"ID", "Title"},
"dataList": []AdFile{
{ID: 1, Title: "Title1"},
{ID: 2, Title: "Title2"},
},
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `{{$columns := .columns}}
{{range $dx := .dataList}}
{{range $c := $columns}}
{{- Field $dx $c }}
{{end}}
{{end}}`
上述应用程序的输出(在去游乐场 https://play.golang.org/p/yz3kCkue1aL):
1
Title1
2
Title2
注:注册时省略了错误检查"Field"
功能。您可以改进它以返回nil
如果给定的字段名称无效,或者返回由模板引擎处理的错误(在这种情况下,模板执行将因您返回的错误而中止)。