gpt4 book ai didi

去模板名称

转载 作者:IT老高 更新时间:2023-10-28 13:04:32 26 4
gpt4 key购买 nike

html/template(和 text/template)包中,template.New有以下签名:

func New(name string) *Template

name 究竟是做什么用的?我已经扫描了文档(和一些来源),但无济于事。我只是用一个空字符串实例化我的所有模板,它似乎没有什么区别。我为什么要为一个名字而烦恼?

即使对于命名模板,两者似乎也是等效的:

template.Must(template.New("").Parse(`{{ define "body" }}Body{{ end }}`))
template.Must(template.New("body").Parse(`Body`))

https://play.golang.org/p/wKzCHdLf2S

最佳答案

模板的名称——不出所料——是命名模板。

它有什么用?只要您不想引用模板,这并不重要。但是如果你想引用它,那么是的,你通过它的名字来引用它。

您想什么时候引用它?当您想在另一个模板中包含一个模板时,例如使用 {{template}} 操作,或者当您想使用 Template.ExecuteTemplate() 执行特定模板时.

到目前为止一切顺利,但仍然缺少关键点。这不是明确的/微不足道的:a template.Template值是“已解析模板的表示”。但是这里的措辞有点“不完美”。 template.Template 值可能是(并且通常是)多个关联模板的集合template.Template 有一个未导出的字段:

tmpl   map[string]*Template // Map from name to defined templates.

这个 tmpl 字段包含所有其他关联的模板,这些模板对模板可见,并且可以通过它们的名称引用——是的。

当您一次解析 多个 模板时,使用 Template.ParseFiles()Template.ParseGlob() ,然后模板将由文件名命名,并且它们将自动关联(上述函数返回单个 template.Template 值,该值包含所有已解析的模板,关联)。 Template.ParseFiles() 的文档对此很清楚:

ParseFiles creates a new Template and parses the template definitions from the named files. The returned template's name will have the base name and parsed contents of the first file. [...]

When parsing multiple files with the same name in different directories, the last one mentioned will be the one that results. For instance, ParseFiles("a/foo", "b/foo") stores "b/foo" as the template named "foo", while "a/foo" is unavailable.

模板名称可以来自多个地方:

  • 它可以来自文件名(如上所示)
  • 可以显式指定(如果使用 {{define "somename"}}{{block "somename"}} 操作定义),
  • 或者它可以定义为传递给 template.New() 的参数(功能)或Template.New() (方法)

让我们看一些例子:

func main() {
t := template.Must(template.New("one").Parse(t1src))
template.Must(t.New("other").Parse(t2src))

// error checks omitted for brevity
// Executes default, "one":
t.Execute(os.Stdout, nil)

// Executes explicit, "one":
t.ExecuteTemplate(os.Stdout, "one", nil)

// Executes explicit, "other":
t.ExecuteTemplate(os.Stdout, "other", nil)
}

const t1src = `I'm some template.
`
const t2src = `I'm some OTHER template.
`

输出(在 Go Playground 上尝试):

I'm some template.
I'm some template.
I'm some OTHER template.

如果您现在继续,将前 2 行更改为:

t := template.Must(template.New("one").Parse(t1src))
t = template.Must(t.New("other").Parse(t2src))

那么这里发生的事情是我们为t分配了一个新的template.Template值,这是解析t2src的结果,所以这将是默认设置,但仍然可以在关联时从中“访问”两个模板。输出变为这个(在 Go Playground 上尝试):

I'm some OTHER template.
I'm some template.
I'm some OTHER template.

调用 template.New()(函数)创建一个新模板,与 none 关联。调用 Template.New()(方法)时,返回的模板将与调用该方法的(所有)模板相关联。

现在让我们看一些关于“嵌入式”模板的示例。

func main() {
t := template.Must(template.New("one").Parse(t1src))
template.Must(t.New("other").Parse(t2src))
template.Must(t.New("third").Parse(t3src))

t.Execute(os.Stdout, nil)
t.ExecuteTemplate(os.Stdout, "one", nil)
t.ExecuteTemplate(os.Stdout, "other", nil)
t.ExecuteTemplate(os.Stdout, "embedded", nil)
t.ExecuteTemplate(os.Stdout, "third", nil)
}

const t1src = `I'm some template. {{block "embedded" .}}I'm embedded in "one".
{{end}}`
const t2src = `I'm some OTHER template.
`
const t3src = `I'm the 3rd, including everything from "one": {{template "one"}}
`

输出(在 Go Playground 上尝试):

I'm some template. I'm embedded in "one".
I'm some template. I'm embedded in "one".
I'm some OTHER template.
I'm embedded in "one".
I'm the 3rd, including everything from "one": I'm some template. I'm embedded in "one".

现在应该很明显模板名称的作用是什么,以及它来自哪里。

关于去模板名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41176355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com