当我尝试使用Funcs和FuncMap时,它注意到Go模板有一件奇怪的事情。以下代码按预期工作:
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\"}}知道为什么吗?这是一个bug吗?有没有在模板中使用方法/函数的更简单的方法?
发布于 2012-04-18 06:31:37
ParseFiles可能会使用更好的文档。一个模板对象可以有多个模板,并且每个模板都有一个名称。如果查看ParseFiles的实现,您会发现它使用文件名作为template对象内部的模板名称。因此,将文件命名为与模板对象相同的名称(通常可能不太实用),或者使用ExecuteTemplate而不只是Execute。
发布于 2014-01-02 04:08:03
索尼娅的答案在技术上是正确的,但让我更加困惑。下面是我最终是如何让它工作的:
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 }}发布于 2020-02-17 14:13:04
你需要首先解析所有的文件并执行它们,.you不能直接访问所有的文件。
https://stackoverflow.com/questions/10199219
复制相似问题