golang开发web页面时,会把页面的公共部分抽离出来,定义成组件
比如定义一个header,然后其他页面就无需再重复写了,直接引入即可
//header.html
{{define "header"}}
this is header. Current User:{{.user.Name}}
{{end}}
//detail.html
{{template "header" .user}}
但是此时如果你想再展示天气,你可以定义一个UserWithWeather,这就有点不伦不类了
我们可以定义一个map模板函数
template.New("view").Funcs(template.FuncMap{
"mapof": func(kvpairs ...interface{}) (map[string]interface{}, error) {
if len(kvpairs)%2 != 0 {
return nil, errors.New("wrong number of arguements")
}
dict := make(map[string]interface{}, len(kvpairs)/2)
for i := 0; i < len(kvpairs); i += 2 {
key, ok := kvpairs[i].(string)
if !ok {
return nil, errors.New("map keys must be strings")
}
dict[key] = kvpairs[i+1]
}
return dict, nil
},
})
这个函数有点类似java的Map.of函数,接收偶数个参数,按照k1,v1,k2,v2,k3,v3...的顺序传递,结果返回一个map[string]interface{}
{{template "header" mapof "user" .user "weather" .weather}}