转到模板函数(Go template function)

2019-07-29 01:13发布

它注意到与围棋模板一个奇怪的事情时,我尝试使用FuncsFuncMap 。 下面的代码按预期工作:

buffer := bytes.NewBufferString("")

funcMap := template.FuncMap{
    "label": strings.Title,
}

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "")

return string(buffer.Bytes()) //=> "Alex"

但是,当我尝试把模板文件,它不工作( Execute()说: "alex" is an incomplete or empty template ):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

随着template.html:

{{label \"alex\"}}

任何想法,为什么? 这是一个错误? 是否有更简单的使用方法/函数模板的方式?

Answer 1:

ParseFiles或许可以用更好的文档。 一个模板对象中可以有多个模板,每个人都有一个名字。 如果你看一下ParseFiles的实现,你看到它使用的文件名作为模板对象内的模板名称。 因此,您的文件命名一样的模板对象,(可能不是一般实用)或者使用ExecuteTemplate,而不是仅仅执行。



Answer 2:

索尼娅的答案在技术上是正确的,但留给我更糊涂了。 下面是我最终得到了它的工作:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html")
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
    return
}
err = t.Execute(w, data)
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
}

模板的名称是模板的裸文件名,而不是完整的路径。 Execute将执行提供它的命名相匹配的默认模板,因此没有必要使用ExecuteTemplate

在这种情况下, _base.html文件是最外层的容器,例如:

<!DOCTYPE html>
<html><body>
<h1>{{ template "title" }}</h1>
{{ template "content" }}
</body></html>

home.html定义了具体的部件:

{{ define "title" }}Home{{ end }}

{{ define "content" }}
Stuff
{{ end }}


文章来源: Go template function