从另一个模板中获取go模板的值

时间:2018-01-15 11:55:56

标签: go go-templates

我有两个模板T1和T2。我想获得T1的输出并在T2内对它进行一些额外的处理。我的问题是:

如何将T1的输出存储在T2内的变量中?这甚至可能吗?

这是一些伪模板:

{{define "T1"}}
    {{ printf "%s-%s" complex stuff }}
{{end}}
{{define "T2"}}
    {{ $some_var := output_from_template "T1"}}  <<<<<<<<<<<
    {{ etc }}
{{end}}

1 个答案:

答案 0 :(得分:1)

没有内置支持将模板结果存储在模板变量中,仅用于包含结果。

但您可以使用您想要的任何复杂功能注册自定义功能。您可以注册GetOutput函数,该函数将执行由其名称标识的模板,并且可以将结果作为string返回,您可以将其存储在模板变量中。

执行此操作的示例:

func main() {
    t := template.New("")

    t = template.Must(t.Funcs(template.FuncMap{
        "GetOutput": func(name string) (string, error) {
            buf := &bytes.Buffer{}
            err := t.ExecuteTemplate(buf, name, nil)
            return buf.String(), err
        },
    }).Parse(src))

    if err := t.ExecuteTemplate(os.Stdout, "T2", nil); err != nil {
        panic(err)
    }
}

const src = `
{{define "T1"}}{{ printf "%s-%s" "complex" "stuff" }}{{end}}
{{define "T2"}}
    {{ $t1Out := (GetOutput "T1")}}
    {{ printf "%s-%s" "even-more" $t1Out }}
{{end}}`

输出将是(在Go Playground上尝试):

    even-more-complex-stuff

"T1"模板只输出"complex-stuff""T2"模板获取"T1"的输出,并连接静态文本"even-more-"和结果"T1"

已注册的GetOutput函数获取要执行的模板的名称,通过将其输出定向到本地缓冲区来执行它,并返回缓冲区的内容(以及执行的可选错误)。 / p>

修改:我发现完全相同:Capture or assign golang template output to variable