Go 模板 post 处理:可能吗?

Go template post processing: is it possible?

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

{{ template "subtemplate" | indent 10 }}

本文indent 10纯属虚构,只是为了说明我所需要的。

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

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

最接近 {{ 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