【问题标题】:Getting values from a template execution从模板执行中获取值
【发布时间】:2015-07-12 10:30:06
【问题描述】:

我有一个 HTML 模板,我通过 map[string]string 变量执行该模板。模板使用该变量创建我发送给客户端的 HTML 输出。

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

据我所知,无法修改我传递给 Execute 的变量(类似于{{.output = "value"}})。

那么我怎样才能从模板执行中获得多个输出值呢?

【问题讨论】:

  • 在主程序中生成您需要的值然后将它们传递给模板可能更容易,而不是尝试在模板中生成它们并将它们返回给调用者...
  • 是的,它会更容易,但在这种情况下,我必须修改程序并在每次我想改变行为时编译它。这样,它可以由知道如何创建模板但不知道如何在 Go 中编程的其他人在外部完成。

标签: templates go


【解决方案1】:

您实际上不需要传递 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()
}

playground

您总是可以将FuncMap 传递给模板,这是一个非常简单的示例:

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()
}

playground

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多