如何将命名模板的结果发送给函数

时间:2019-01-24 16:55:31

标签: go go-templates kubernetes-helm

我试图缩进命名模板的结果。我已经尝试了以下所有语法。围绕“模板名称”的括号。也不起作用。

{{template "my-org.labels" . | indent 8}}
{{indent 8 template "mbfs-postgres.labels" .}}
{{with template "mbfs-postgres.labels" .}}...

1 个答案:

答案 0 :(得分:1)

不存在将模板结果发送到函数的内置支持。

可以编写一个模板函数来执行此操作:execTemplate函数返回一个函数,该函数执行t中的命名模板。

func execTemplate(t *template.Template) func(string, interface{}) (string, error) {
    return func(name string, v interface{}) (string, error) {
        var buf strings.Builder
        err := t.ExecuteTemplate(&buf, name, v)
        return buf.String(), err
    }
}

像这样使用它:

    t := template.New("")
    t = template.Must(t.Funcs(template.FuncMap{"exec": execTemplate(t), "inent": indent}).Parse(`
The template is: {{exec "labels" . | indent 8}}
{{define "labels"}}Hello from Labels!{{end}}`))
    t.Execute(os.Stdout, nil)

此基本概念有一些变体,可能会使用或可能不太方便。例如,可以将值作为参数传递给模板,而不必使用模板函数。

type execTemplate struct {
    t *template.Template
}

func (et execTemplate) Execute(name string, v interface{}) (string, error) {
    var buf strings.Builder
    err := et.t.ExecuteTemplate(&buf, name, v)
    return buf.String(), err
}

t := template.Must(template.New("").Funcs(template.FuncMap{"indent": 
indent}).Parse(`The template is: {{.Execute "labels" . | indent 8}}
   {{define "labels"}}Hello from Labels!{{end}}`))
fmt.Println(t.Execute(os.Stdout, execTemplate{t}))