golang template函数传递多个参数

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
		},
	})
	
	

这个函数有点类似javaMap.of函数,接收偶数个参数,按照k1,v1,k2,v2,k3,v3...的顺序传递,结果返回一个map[string]interface{}

{{template "header" mapof "user" .user "weather" .weather}}