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