gpt4 book ai didi

go - 如何通过模板中的变量访问对象字段?

转载 作者:IT王子 更新时间:2023-10-29 01:41:08 26 4
gpt4 key购买 nike

我有一个嵌套循环:

{{$columns := .columns}}
{{range $dx := .dataList}}
{{range $c := $columns}}
{{index $dx $c}}
{{end}}
{{end}}

dataList 是orm模型数组。使用 ID, Title 字段,然后 columns[]string 变量包含所有 orm 模型字段名称,如 ID, Title.

type AdFile struct {
ID uint `gorm:"primary_key"`
Title string
}

我已经尝试使用 {{(index .listData 0).Title}} 并且它有效。

但是如果我想访问 $dx.Title, $dx.ID .... with Title, ID 作为变量,但它不起作用。我试过 $dx[$c]

可以很容易地用Python实现同样的事情

for i in list_data
tr
for p in columns
td=i[p]

最佳答案

要访问由名称给出的结构的字段值,您需要来自 reflect 的帮助包裹。可以这样做:

v := AdFile{ID:1, Title: "T1"} // A struct value
name := "ID" // field name

fieldValue := reflect.ValueOf(v).FieldByName(name).Interface()

由于这是 Go 代码,您不能将其嵌入模板中。但是您可以使用 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}}`

上述应用程序的输出(在 Go Playground 上尝试):

1
Title1


2
Title2

注意:在注册的"Field"函数中省略了错误检查。如果给定的字段名称无效,您可以改进它以返回 nil,或者返回由模板引擎处理的错误(在这种情况下,模板执行将因您返回的错误而中止)。

关于go - 如何通过模板中的变量访问对象字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48579757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com