【问题标题】:How can I send the result of named-template to a function [duplicate]如何将命名模板的结果发送到函数[重复]
【发布时间】:2019-01-24 16:55:30
【问题描述】:

我正在尝试缩进命名模板的结果。我已经尝试了以下所有语法。 “模板名称”周围的括号。也不行。

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

【问题讨论】:

    标签: go go-templates kubernetes-helm


    【解决方案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}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多