Capture or assign golang template output to variable
There is no "builtin" action for getting the result of a template execution, but you may do it by registering a function which does that.
You can register functions with the Template.Funcs()
function, you may execute a named template with Template.ExecuteTemplate()
and you may use a bytes.Buffer
as the target (direct template execution result into a buffer).
Here is a complete example:
var t *template.Template
func execTempl(name string) (string, error) {
buf := &bytes.Buffer{}
err := t.ExecuteTemplate(buf, name, nil)
return buf.String(), err
}
func main() {
t = template.Must(template.New("").Funcs(template.FuncMap{
"execTempl": execTempl,
}).Parse(tmpl))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}
const tmpl = `{{define "my-template"}}my-template content{{end}}
See result:
{{$var := execTempl "my-template"}}
{{$var}}
`
Output (try it on the Go Playground):
See result:
my-template content
The "my-template"
template is executed by the registered function execTempl()
, and the result is returned as a string
, which is stored in the $var
template variable, which then is simply added to the output, but you may use it to pass to other functions if you want to.
bitsofinfo
Updated on October 09, 2022Comments
-
bitsofinfo over 1 year
Within a template, how can I achieve this?
{{$var := template "my-template"}}
I just get
"unexpected <template> in operand"
. -
bitsofinfo over 7 yearsThanks, the problem is that I don't have access to the go code that is processing the template: (i'm using consul-template)
-
Nikolai Ehrhardt over 2 yearsHow can I know the buffer is big enough?
-
icza over 2 years@NikolaiEhrhardt
bytes.Buffer
increases its capacity on demand, it does not run out of space. -
Nikolai Ehrhardt over 2 yearsYes I assumed that, but did not study its write-method ...