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

从另一个模板中获取go模板的值,go,go-templates,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"}} <<<<<<<<<<&

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

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

下面是一些伪模板:

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

对于在模板变量中存储模板的结果,没有内置的支持,只支持包含结果

但是,您可以将自定义函数注册到您想要的任何复杂功能中。您可以注册一个GetOutput函数,该函数将执行由其名称标识的模板,它可以将结果作为字符串返回,您可以将其存储在模板变量中

执行此操作的示例:

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}}`
将在以下服务器上尝试输出:

T1模板只输出复杂的内容,T2模板获得T1的输出,并将静态文本和T1的结果连接起来

registered GetOutput函数获取要执行的模板的名称,通过将其输出定向到本地缓冲区来执行该模板,并返回缓冲区的内容及其执行的可选错误


编辑:我发现了一个完全相同的副本:

@Marc:这不是一个副本。我是专门询问任务的。看一看这条线路,所有这些都很公平,但是@icza找到了一条:为什么不直接从T2调用T1呢?请参阅template action@mh cbon:在打印结果之前,希望将结果存储在内存中的原因有很多。就我个人而言,我需要将它传递给一些无法使用管道的正则表达式函数。@Marc:cool beans。请随时将其标记为副本。我喜欢保留副本,因为这样更容易找到东西。谢谢你的意见
    even-more-complex-stuff