嵌套golang模板中的变量

时间:2016-08-31 16:42:00

标签: templates go

我想在golang模板中定义变量,而不是在二进制文件中定义变量,因此不需要重新编译。

在Go中,我设置了一些变量:

var animals = map[string]string{
    "spirit_animal":    "cat",
    "spirit_predator":  "dog",
}

我执行模板:t.ExecuteTemplate(w, "main", variables)将这些变量传递给模板。

现在我想把这些变量从进入" main"模板。

{{$spirit_animal:="cat"}} {{$spirit_animal}}

我打电话给这样的子模板:

{{ template "navbar" . }}

问题是嵌套模板(子模板)似乎无法访问任何变量。

documentation,"模板调用不会从其调用点继承变量。"阅读" text / template"的文档,听起来好像变量可能无法在嵌套模板中使用。

有关如何从二进制文件中获取这些变量以及嵌套模板可访问的单个文本位置的任何建议都不需要在更改时重新编译?

1 个答案:

答案 0 :(得分:1)

您确实可以!您只需要将变量传递到嵌套模板中即可。

您引用的文档是关于模板如何无法从go进程中读取变量的信息,除非您明确地将它们传递进来。

类似地,嵌套模板将采用您传递的所有内容,而已。

来自https://golang.org/pkg/text/template/#hdr-Actions

{{template "name"}}
    The template with the specified name is executed with nil data.

{{template "name" pipeline}}
    The template with the specified name is executed with dot set
    to the value of the pipeline.

以下是一个简短的示例,根据您的提示:

package main

import (
    "os"
    "text/template"
)

func main() {
    var animals = map[string]string{
        "spirit_animal":   "cat",
        "spirit_predator": "dog",
    }

    const letter = `
{{define "echo"}}Inside a template, I echo what you say: {{.}}{{end}}
{{define "predator"}}Inside a template, I know that your predator is: {{.spirit_predator}}{{end}}

Your spirit animal is: {{.spirit_animal}}

{{template "predator" . }}

{{template "echo" .spirit_animal }}`

    t := template.Must(template.New("letter").Parse(letter))
    _ = t.Execute(os.Stdout, animals)
}

https://play.golang.org/p/3X7IQasWlsR