Golang模板函数返回空白页

368yc8dk  于 2023-04-27  发布在  Go
关注(0)|答案(3)|浏览(150)

我正在尝试更改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测试。去正在主包
浏览器或终端中没有打印错误消息。
我错过了什么?

t1rydlwq

t1rydlwq1#

经过一番研究和讨论,我猜这条线是不正确的:

tmpl, err := template.New(pageFile).ParseFiles(pageFile)

你不需要做New(pageFile),你只需要直接使用ParseFiles方法,记住模板的名字将等于传递文件的基本名字。
所以,触摸一点yhe代码并用途:

tmpl, err := template.ParseFiles(pageFile)

更多信息请参见this example

disbfnqx

disbfnqx2#

由于html/template在下面使用text/template,您通常可以在text/template包中找到有关模板如何工作的其他信息。
从ParseFiles的文档:
由于ParseFiles创建的模板是由参数文件的基名称命名的,所以t * 通常应该 * 具有文件的一个(基)名称的名称 *。如果没有,根据调用ParseFiles之前t的内容,t.Execute可能会失败。在这种情况下,使用t.ExecuteTemplate执行有效的模板。
(强调我的)
这个问题是由于您将模板文件的路径作为模板的名称传递,然后调用ParseFiles方法而引起的。
由于ParseFilesParseGlob是如何实现的,这会导致显式传递给New的名称与这两个方法分配给解析模板的名称不一致。
您可以通过调用DefinedTemplates方法来测试这一点。
https://play.golang.org/p/LEi-xSn4LOF
另外,请查看@icza的Go模板名称答案,以更好地了解模板。

km0tfn4u

km0tfn4u3#

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)
}

相关问题