首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go模板函数

Go模板函数
EN

Stack Overflow用户
提问于 2012-04-18 05:11:42
回答 3查看 9.3K关注 0票数 31

当我尝试使用FuncsFuncMap时,它注意到Go模板有一件奇怪的事情。以下代码按预期工作:

代码语言:javascript
复制
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):

代码语言:javascript
复制
t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

使用template.html:

代码语言:javascript
复制
{{label \"alex\"}}

知道为什么吗?这是一个bug吗?有没有在模板中使用方法/函数的更简单的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-18 06:31:37

ParseFiles可能会使用更好的文档。一个模板对象可以有多个模板,并且每个模板都有一个名称。如果查看ParseFiles的实现,您会发现它使用文件名作为template对象内部的模板名称。因此,将文件命名为与模板对象相同的名称(通常可能不太实用),或者使用ExecuteTemplate而不只是Execute。

票数 34
EN

Stack Overflow用户

发布于 2014-01-02 04:08:03

索尼娅的答案在技术上是正确的,但让我更加困惑。下面是我最终是如何让它工作的:

代码语言:javascript
复制
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文件是最外层的容器,例如:

代码语言:javascript
复制
<!DOCTYPE html>
<html><body>
<h1>{{ template "title" }}</h1>
{{ template "content" }}
</body></html>

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

代码语言:javascript
复制
{{ define "title" }}Home{{ end }}

{{ define "content" }}
Stuff
{{ end }}
票数 16
EN

Stack Overflow用户

发布于 2020-02-17 14:13:04

你需要首先解析所有的文件并执行它们,.you不能直接访问所有的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10199219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档