You can register a function that executes the template to be included and returns the result as string. What stringcan then be inserted into another template, the correct context-sensitive escaping is applied automatically:
var tmpl = `{{define "main"}}<script>var xx = {{exect "html-snippet" .}};</script>{{end}}{{define "html-snippet"}}<div>
<img src="{{.}}">
</div>{{end}}`
var t *template.Template
func exect(name string, data interface{}) string {
buf := &bytes.Buffer{}
if err := t.ExecuteTemplate(buf, name, data); err != nil {
fmt.Println("Error:", err)
}
return buf.String()
}
func main() {
t = template.Must(template.New("fo").Funcs(template.FuncMap{
"exect": exect,
}).Parse(tmpl))
if err := t.ExecuteTemplate(os.Stdout, "main", "some.jpg"); err != nil {
fmt.Println(err)
}
}
( Go Playground):
<script>var xx = "\u003cdiv\u003e\n\t\u003cimg src=\"some.jpg\"\u003e\n\u003c/div\u003e";</script>
: , 2 ( ), exect() :
func exect(name string, data interface{}) (string, error) {
buf := &bytes.Buffer{}
err := t.ExecuteTemplate(buf, name, data)
return buf.String(), err
}
. Go Playground.