Go 如何通过模板中的变量访问对象字段?
我有一个嵌套循环:Go 如何通过模板中的变量访问对象字段?,go,nested,field,go-templates,Go,Nested,Field,Go Templates,我有一个嵌套循环: {{$columns := .columns}} {{range $dx := .dataList}} {{range $c := $columns}} {{index $dx $c}} {{end}} {{end}} dataList是orm模型数组。使用ID,Title字段,然后columns是[]字符串变量包含所有orm模型字段名,如ID,Title type AdFile struct { ID uint `gorm
{{$columns := .columns}}
{{range $dx := .dataList}}
{{range $c := $columns}}
{{index $dx $c}}
{{end}}
{{end}}
dataList是orm模型数组。使用ID,Title
字段,然后columns
是[]字符串
变量包含所有orm模型字段名,如ID,Title
type AdFile struct {
ID uint `gorm:"primary_key"`
Title string
}
我尝试了{{(index.listdata0.Title}}
,效果很好
但是如果我想访问$dx.Title
,$dx.ID
。。。。使用Title
,ID
作为变量,但它不起作用。我试过$dx[$c]
可以轻松地用Python实现同样的功能
for i in list_data
tr
for p in columns
td=i[p]
要访问由其名称给定的结构的字段值,需要软件包的帮助。可以这样做:
v := AdFile{ID:1, Title: "T1"} // A struct value
name := "ID" // field name
fieldValue := reflect.ValueOf(v).FieldByName(name).Interface()
因为这是Go代码,所以不能将其嵌入模板中。但是您可以使用可以从模板调用的方法注册自定义函数
让我们这样做:将此功能包装到一个函数中,并按名称“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}}`
上述应用程序的输出(请在上尝试):
注意:在注册的
“字段”
功能中省略了错误检查。如果给定的字段名无效,您可以将其改进为返回nil
,或者返回由模板引擎处理的错误(在这种情况下,模板执行将因返回的错误而中止)。我认为这是一个好问题。在这里学习重要的东西。为什么要结束投票?你说$dx.Title
不起作用,但你的代码不起作用。还有,它怎么不起作用呢?结果如何?您的实际数据结构是什么?这里没有足够的信息来回答您的问题。包括一个。@Flimzy这是一个正确且足够信息的问题。我该问什么$dx.Title=$dx.$c
,我只想像其他语言一样访问对象字段/属性。@TomSawyer你能给我们完整的代码和数据结构吗?我想他的意思是,$c
正在迭代Title
ID等等。谢谢icza,我认为自定义函数是唯一的机会:(,go模板应具有此的内置功能
1
Title1
2
Title2