我希望创建一个通用/通用的 Go html 模板,它将根据其输入生成一个标准的 html 表。我曾希望按名称查找结构成员,但我无法完成这项工作。
我环顾四周,找不到解决方案,所以我要么遗漏了一些明显的东西,要么方法是错误的。在这方面,我会接受一种解决方案,该解决方案显示了一种替代或更好的方法,可以避免尝试这种查找。
示例模板:
{{ $fields := .FieldMap }}
<table>
<thead>
<tr>
{{ range $key, $value := $fields }}
<th>{{ $key }}</th>
{{ end }}
</tr>
</thead>
<tbody>
{{ range $i, $v := .Model }}
<tr>
{{ $rowData := . }}
{{/* FAILS: error calling index: can't index item of type main.Person <td> {{ index . "FirstName"}}</td>*/}}
{{ range $key, $value := $fields }}
{{/* FAILS: error calling index: can't index item of type main.Person <td> {{ index $rowData $value }}</td>*/}}
{{/* FAILS: bad character U+0024 '$' <td> {{ $rowData.$value }}</td>*/}}
{{ end }}
</tr>
{{ end }}
</tbody>
</table>
示例围棋:
包主
import (
"html/template"
"os"
)
type Person struct {
FirstName string
LastName string
}
type Animal struct {
Species string
}
type TemplateData struct {
Model interface{}
FieldMap map[string]string
}
func main() {
t, err := template.ParseFiles("table.gohtml")
if err != nil {
panic(err)
}
// Here we use Person, but I may want to pass other types of struct to the template, for example "Animal"
dataPerson := TemplateData{
Model: []Person{
{
FirstName: "Test",
LastName: "Template",
},
},
FieldMap: map[string]string{"First": "FirstName", "Last": "LastName"},
}
err = t.Execute(os.Stdout, dataPerson)
if err != nil {
panic(err)
}
}
我希望它清楚我想要做什么 - 有一个模板,我可以在各种类型的结构中重用它。
繁花不似锦
相关分类