Golang模板函数返回空白页面

时间:2018-05-16 16:52:20

标签: go go-templates

我正在尝试更改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在主程序包

中运行它

浏览器或终端中没有打印错误信息。

我在这里缺少什么?

3 个答案:

答案 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方法。

由于实现了ParseFilesParseGlob的实现方式,这会导致您明确传递给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)
}