嵌套 golang 模板中的变量

Zam*_*col 6 templates go

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

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

var animals = map[string]string{
    "spirit_animal":    "cat",
    "spirit_predator":  "dog",
}
Run Code Online (Sandbox Code Playgroud)

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

现在我想将这些变量从 go 中取出到“主”模板中。

{{$spirit_animal:="cat"}} {{$spirit_animal}}
Run Code Online (Sandbox Code Playgroud)

我这样称呼子模板:

{{ template "navbar" . }}
Run Code Online (Sandbox Code Playgroud)

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

文档中,“模板调用不会从其调用点继承变量。” 阅读“文本/模板”的文档,听起来变量可能无法在嵌套模板中使用。

关于如何将这些变量从二进制文件中取出并放入不需要在更改时重新编译的嵌套模板可访问的单个文本位置的任何建议?

Liy*_*ang 8

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

您引用的文档是关于模板如何无法从 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.
Run Code Online (Sandbox Code Playgroud)

这是一个根据您的提示编写的快速示例:

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)
}
Run Code Online (Sandbox Code Playgroud)

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