1 回答

TA貢獻1851條經(jīng)驗 獲得超4個贊
創(chuàng)建一個模板函數(shù),將結(jié)構(gòu)字段名稱和值作為映射返回:
// fields returns map of field names and values for struct s.
func fields(s interface{}) (map[string]interface{}, error) {
v := reflect.Indirect(reflect.ValueOf(s))
if v.Kind() != reflect.Struct {
return nil, fmt.Errorf("%T is not a struct", s)
}
m := make(map[string]interface{})
t := v.Type()
for i := 0; i < t.NumField(); i++ {
sv := t.Field(i)
m[sv.Name] = v.Field(i).Interface()
}
return m, nil
}
解析文件時指定函數(shù):
t, err := template.New("").Funcs(template.FuncMap{"fields": fields}).ParseFiles("table.gohtml")
if err != nil {
panic(err)
}
像這樣使用它:
{{range $i, $v := .Model}}
<tr>
{{$m := fields $v}}
{{range $key, $value := $fields}}
<td>{{index $m $value}}</td>
{{end}}
</tr>
{{end}}
在操場上運行它。
另一種方法是編寫一個按名稱查找字段的函數(shù):
func field(s interface{}, k string) (interface{}, error) {
v := reflect.Indirect(reflect.ValueOf(s))
if v.Kind() != reflect.Struct {
return nil, fmt.Errorf("%T is not a struct", s)
}
v = v.FieldByName(k)
if !v.IsValid() {
return nil, fmt.Errorf("no field in %T with name %s", s, k)
}
return v.Interface(), nil
}
用函數(shù)解析:
t, err := template.New("").Funcs(template.FuncMap{"field": field}).ParseFiles("table.gohtml")
像這樣使用它:
{{range $i, $v := .Model}}
<tr>
{{range $key, $value := $fields}}
<td>{{field $v $value}}</td>
{{end}}
</tr>
{{end}}
在操場上運行它。
- 1 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報