我正在尝试更改Golang hml模板的默认分隔符,下面是我现在使用的代码:
func indexHandler(w http.ResponseWriter, r *http.Request) {
pageFile := "html/testpage.html"
tmpl, err := template.New(pageFile).Delims("[[", "]]").ParseFiles(pageFile)
//tmpl := template.Must(template.ParseFiles(pageFile))
if (err!=nil){
fmt.Println("Error")
fmt.Println(err)
}
tmpl.Execute(w, nil)
}
上面的代码在浏览器中呈现一个空白页面。如果我使用注解掉的代码而不是第二行,它将正确呈现。
下面是模板页面的源代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The HTML5 </title>
<meta name="description" content="HTML5">
<meta name="author" content="Test">
</head>
<body>
This is html page
</body>
</html>
我的go版本是:go version go1.10.2 linux/amd64
我运行它的go run test.go
测试。去正在主包
浏览器或终端中没有打印错误消息。
我错过了什么?
3条答案
按热度按时间t1rydlwq1#
经过一番研究和讨论,我猜这条线是不正确的:
你不需要做
New(pageFile)
,你只需要直接使用ParseFiles
方法,记住模板的名字将等于传递文件的基本名字。所以,触摸一点yhe代码并用途:
更多信息请参见this example
disbfnqx2#
由于
html/template
在下面使用text/template
,您通常可以在text/template
包中找到有关模板如何工作的其他信息。从ParseFiles的文档:
由于ParseFiles创建的模板是由参数文件的基名称命名的,所以t * 通常应该 * 具有文件的一个(基)名称的名称 *。如果没有,根据调用ParseFiles之前t的内容,t.Execute可能会失败。在这种情况下,使用t.ExecuteTemplate执行有效的模板。
(强调我的)
这个问题是由于您将模板文件的路径作为模板的名称传递,然后调用
ParseFiles
方法而引起的。由于
ParseFiles
和ParseGlob
是如何实现的,这会导致显式传递给New
的名称与这两个方法分配给解析模板的名称不一致。您可以通过调用
DefinedTemplates
方法来测试这一点。https://play.golang.org/p/LEi-xSn4LOF
另外,请查看@icza的Go模板名称答案,以更好地了解模板。
km0tfn4u3#