定义一个顶级的Go模板。

huangapple go评论78阅读模式
英文:

Defining a top level go template

问题

假设我有两个文本文件(go模板):

child.tmpl

TEXT1
Hello {{ . }}

top.tmpl

TEXT2
{{ template "child.tmpl" "argument" }}

child.tmpl模板嵌套在top.tmpl中。

一个典型的解析它们的程序将是:

package main

import (
    "os"
    "text/template"
)

func main() {
    t := template.Must(template.ParseFiles("child.tmpl", "top.tmpl"))
    t.ExecuteTemplate(os.Stdout, "top.tmpl", nil)
}

有没有一种方法可以使用{{ . }}符号将模板作为参数嵌入到顶级模板中?类似于{{ template {{.}} "argument" }}这样的写法?

  • 更一般地说,有什么最佳方法来定义一个布局模板,以便我可以将其用作顶级模板来供多个子模板使用?
英文:

Suppose that I have tow text files (go templates):

child.tmpl

TEXT1 
Hello {{ . }}

top.tmpl

TEXT2
{{ template "child.tmpl" "argument"}}

the child.tmpl template is nested in top.tmpl

A typical program to parse them will be :

package main

import (
	"os"
	"text/template"
)

func main() {
	t := template.Must(template.ParseFiles("child.tmpl", "top.tmpl")
	t.ExecuteTemplate(os.Stdout, "top.tmpl", nil)
}

Is there any method the pass the template to be embedded in the top-level template as an argument using the {{ . }} notation ?
something like {{ template {{.}} "argument" }}

  • More generally, what is the best way to define a layout template so I can use it like a top-level template to multiple child templates ?

答案1

得分: 2

有两种被接受的方法来解决你的问题:

第一种方法是编写自己的模板包含函数,并将其注册为 template.FuncMap,通过 template.Funcs 将其与你的模板关联起来。

另一种方法是在你的子模板中使用 {{define xxx}} 块。然后你可以有两个不同的文件来定义相同的模板:

  • file1.html: {{define body}}...{{end}}
  • file2.html: {{define body}}...{{end}}

根据你的需求解析正确的文件,在你的父模板中使用 {{template body "argument"}}

在我看来,第一种选项更加灵活。

英文:

There are two accepted ways to solve your problem:

The first involves writing your own template-inclusion function and registering it as an template.FuncMap with your template through template.Funcs.

The other way is to use {{define xxx}} blocks in your child templates. Then you could have two different files that define the same template:

  • file1.html: {{define body}}...{{end}}
  • file2.html: {{define body}}...{{end}}

Parse the correct file depending on your needs and in your parent template just do {{template body "argument"}}.

In my opinion, the first option is more flexible.

huangapple
  • 本文由 发表于 2013年9月23日 01:13:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/18946533.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定