2017-09-05 69 views
0

我有两个golang HTML模板,具体如下:golang模板加工和仿制药

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而第二模板需要两个参数,命名为SecondF1SecondF2

现在我有一个结构,它有两个字段,一个用于接收模板名称,另一个用于接收模板参数。

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是有效的,无论有多少模板有(FirstSecond等),每个模板可以具有可变数量的参数(First只有一个精氨酸,而Second有有两个参数,等等)

我不想写N个不同的tmpl.Execute报表与if块为每个模板名称。有没有其他方法可以解决这个问题?谢谢。

回答

0

json.Unmarshaltemplate.Execute都不关心数据的实际类型,这些都将在运行时处理。所以你可以解析json到interface{}并将它传递给你的模板。假设json数据包含您传递数据的模板所期望的字段,这样做可以正常工作。

Playground link

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
    "html/template" 
) 

var templates = map[string]*template.Template{ 
    "A": template.Must(template.New("A").Parse("{{ .A }}")), 
    "B": template.Must(template.New("B").Parse("{{ .B }} and {{ .C.D }}")), 
} 

type tmplReceiver struct { 
    TmplName string 
    TmplArgs string 
} 

func main() { 
    receivers := []tmplReceiver{ 
     tmplReceiver{"A", `{"A": "Value for A"}`}, 
     tmplReceiver{"B", `{"B": "Value for B", "C": { "D": "Value for D" }}`}, 
    } 

    for _, receiver := range receivers { 
     var data interface{} 
     json.Unmarshal([]byte(receiver.TmplArgs), &data) 

     var buffer bytes.Buffer 
     templates[receiver.TmplName].Execute(&buffer, data) 
     fmt.Println(buffer.String()) 
    } 
} 

它打印

的价值诉求

价值B和价值d

+0

但我想这是一个HTTP处理程序,其中的一部分该输入也将来自其他语言。所以我需要一个没有接口或地图的JSON结构。 –

+0

@SankarP我不知道我是否理解你的评论,但在我更新的答案中,你可以处理任何传入的json,不管结构如何,并在你的模板中使用它。唯一的要求是数据包含您想要在模板中使用的字段,但无论如何不能避免。 –