Templates 从模板执行中获取值

Templates 从模板执行中获取值,templates,go,Templates,Go,我有一个传递map[string]字符串变量的HTML模板。模板使用变量创建发送给客户端的HTML输出 除了生成HTML,我还想使用完全相同的模板生成一些返回到主程序的值,这样我就可以使用相同的文件在外部放置一些逻辑 据我所知,不可能修改传递给执行的变量(类似于{{.output=“value”}}) 那么,如何从模板执行中获得多个输出值呢 实际上不需要传递funcmap,只需传递结构 var tmpl = template.Must(template.New("test").Parse(`Be

我有一个传递map[string]字符串变量的HTML模板。模板使用变量创建发送给客户端的HTML输出

除了生成HTML,我还想使用完全相同的模板生成一些返回到主程序的值,这样我就可以使用相同的文件在外部放置一些逻辑

据我所知,不可能修改传递给执行的变量(类似于
{{.output=“value”}}


那么,如何从模板执行中获得多个输出值呢

实际上不需要传递funcmap,只需传递结构

var tmpl = template.Must(template.New("test").Parse(`Before: {{.Data}}{{.Set "YY"}}, after: {{.Data}}`))

func main() {
    c := &CustomData{"XX"}
    tmpl.Execute(os.Stdout, c)
    fmt.Println()
}

您始终可以将a传递给模板,下面是一个非常简单的示例:


在主程序中生成所需的值,然后将其传递给模板可能会更容易,而不是试图在模板中生成值并将其返回给调用者……是的,这会更容易,但在这种情况下,每当我想更改行为时,我都必须修改程序并编译它。通过这种方式,它可以由知道如何创建模板但不知道如何在Go中编程的其他人在外部完成。
const tmpl = `Before: {{.Data}}{{.Set "YY"}}, after: {{.Data}}`

type CustomData struct {
    Data string
}

func (c *CustomData) Set(d string) string { // it has to return anything
    c.Data = d
    return ""
}

func main() {
    c := &CustomData{"XX"}
    funcMap := template.FuncMap{
        "Set": c.Set,
    }
    t, _ := template.New("test").Funcs(funcMap).Parse(tmpl) // don't ignore errors in real code
    t.Execute(os.Stdout, c)
    fmt.Println()
}