【发布时间】:2017-09-05 10:10:30
【问题描述】:
我有两个golang html模板,如下:
var m map[string]string
m = make(map[string]string)
m["First"] = `<html>
<body>First template type {{.First}}
</html>`
m["Second"] = `<html>
<body>Second template type {{.SecondF1}} {{.SecondF2}}
</html>`
第一个 html 模板只需要一个参数,名为 First,而第二个模板需要两个参数,名为 SecondF1 和 SecondF2。
现在我有一个结构体,它有两个字段,一个用于接收模板名称,另一个用于接收模板参数。
type tmplReceiver struct {
TmplName string
TmplArgs string // Receives JSON string
}
现在,上述结构的实例示例如下:
var i, j tmplReceiver
i.TmplName = "First"
i.TmplArgs = `{"Field1": "First Template Argument"}`
j.TmplName = "Second"
j.TmplArgs = `{
"SecondF1": "Second template First Argument",
"SecondF2": "Second template Second Argument"
}`
现在我可以使用地图获取模板字符串,例如:
tmplStr := m[i.TmplName] (or)
tmplStr := m[j.TmplName]
tmpl, _ = template.New("email").Parse(tmplStr)
但是,如何使用单个tmpl.Execute 语句为所有可能的模板类型执行模板。换句话说,如果我想拥有以下代码:
var buff bytes.Buffer
if err := tmpl.Execute(&buff, tmplPtr); err != nil {
log.Fatal(err)
}
log.Println(buff.String())
如何让tmplPtr 有效,无论我有多少模板(First、Second 等),并且每个模板都可以有可变数量的参数(First只有一个参数,而Second 有两个参数,等等)
我不想为每个模板名称编写 N 个不同的 tmpl.Execute 语句,并带有 if 块。有没有其他替代方法来解决这个问题?谢谢。
【问题讨论】: