我正在尝试更改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 version go1.10.2 linux/amd64
我通过go run test.go
test.go在主程序包
浏览器或终端中没有打印错误信息。
我在这里缺少什么?
答案 0 :(得分:3)
由于<object [data]="getSafeUrl(file.fileName)" type="application/pdf"></object>
下方使用html/template
,您通常可以找到有关模板在text/template
包中的工作方式的其他信息。
来自ParseFiles的文档:
由于ParseFiles创建的模板由基本名称命名 对于参数文件,t应通常具有其中一个的名称 (基础)文件的名称。如果没有,取决于t的内容 在调用ParseFiles之前,t。执行可能会失败。在那种情况下使用 t.ExecuteTemplate执行有效的模板。
(强调我的)
问题是由于您将模板文件的路径作为模板名称传递,然后调用text/template
方法。
由于实现了ParseFiles
和ParseGlob
的实现方式,这会导致您明确传递给ParseFiles
的名称与这两个方法赋予的名称之间的不一致解析模板。
您可以通过调用DefinedTemplates
方法对此进行测试。
https://play.golang.org/p/LEi-xSn4LOF
另请参阅@ icza&#39; Go template name answer以更好地了解模板。
答案 1 :(得分:1)
经过一些研究和讨论后,我猜这条线路形成不良:
tmpl, err := template.New(pageFile).ParseFiles(pageFile)
您无需执行New(pageFile)
。您只需要直接使用ParseFiles
方法,并记住templaes的名称将等于传递文件的基本名称。
所以,触摸一下代码并使用:
tmpl, err := template.ParseFiles(pageFile)
有关详情,请参阅this example
答案 2 :(得分:0)
func indexHandler(w http.ResponseWriter, r *http.Request) {
pageFile := "html/testpage.html"
name := "testpage"
tmpl, err := template.New(name).Delims("[[", "]]").ParseFiles(pageFile) //only translate a "name" to New()
//tmpl := template.Must(template.ParseFiles(pageFile))
if (err!=nil){
fmt.Println("Error")
fmt.Println(err)
}
tmpl.Execute(w, nil)
//tmpl.ExecuteTemplate(w, name, nil)
}