【问题标题】:Go template post processing: is it possible?Go 模板后处理:有可能吗?
【发布时间】:2021-12-08 06:05:05
【问题描述】:

在我的模板中,我使用了一个生成一段输出的子模板。 但是模板输出必须移动(因为输出是 YAML 格式)。 是否有可能对模板输出进行后处理?

{{ template "subtemplate" | indent 10 }}

这个indent 10是虚构的,只是为了解释我需要什么。

可以(如@icza 建议的那样)保存输出 进入一个变量,然后使用它, 但也许有更好、更优雅的方法?

{{$var := execTempl "subtemplate"}}
{{$var}}

【问题讨论】:

标签: go templates yaml


【解决方案1】:

最接近{{ template "subtemplate" | indent 10 }} 的方法是定义一个解析和执行subtemplate 并将结果输出为字符串的函数。

var externalTemplates = map[string]*template.Template{
    "subtemplate": template.Must(template.New("subtemplate").Parse(sub_template)),
}

// Executes external template, must be registered with FuncMap in the main template.
func xtemplate(name string) (string, error) {
    var b bytes.Buffer
    if err := externalTemplates[name].ExecuteTemplate(&b, name, nil); err != nil {
        return "", err
    }
    return b.String(), nil
}
t := template.Must(template.New("t").Funcs(template.FuncMap{
    "xtemplate": xtemplate, // register func
}).Parse(main_template))

然后您可以在主模板中使用如下函数:

{{ xtemplate "subtemplate" | indent 10 }}

https://play.golang.org/p/brolOLFT4xL

【讨论】:

  • 基本上和@icza 建议的一样:xtemplateexecTempl,对吧?
  • 是减去可变部分。这就是你不喜欢这种方法的地方,不是吗?
  • 是的,我只是想确保我不会错过任何东西。这是一个很好的方法,反正比我之前的其他丑陋的选择要好
  • @IgorChubin icza 的链接答案与上述答案之间的一个区别是 icza 使用*template.Template 的单个实例,而上述答案使用一个作为主模板和一组“外部模板”。因为上述注册xtemplate 仅与主模板你不能在外部模板中使用它。因此,如果您也希望能够从“外部模板”调用xtemplate,您实际上可能更喜欢单实例版本。虽然没有什么能阻止你向外部注册xtemplate
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多