我在Golang中编写了一个包装器函数,用于从多个文件中呈现模板,如下所示:
func RenderTemplate(w http.ResponseWriter, data interface{}, tmpl... string) {
cwd, _ := os.Getwd()
for _,file:=range tmpl{
file=filepath.Join(cwd,"./view/"+file+".html")
}
t, err := template.ParseFiles(tmpl...)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
templates:=template.Must(t)
err = templates.Execute(w, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
当我从main
函数运行服务器时,控制台会抛出错误:
not enough arguments in call to "html/template".Must
如果我这样写:
templates,err:=template.Must(t)
它也会抛出同样的错误,加上:
assignment count mismatch: 2 = 1
我打算将此函数用于服务器中的路由处理程序:
func IndexHandler(w http.ResponseWriter, r *http.Request) {
files:=[]string{"base","index"}
util.RenderTemplate(w, nil, files...)
}
index.html
使用模板嵌套
base.html
延伸
base.html
模板:
{{define "base"}}
<!DOCTYPE html>
<html>
<head>
<meta charget="utf-8">
<title>{{template "title".}}</title>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/js/isotope.pkgd.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css">
</head>
<body>
{{template "index".}}
</body>
</html>
{{end}}
index.html
模板:
<!DOCTYPE html>
<html>
{{define "title"}}Homepage{{end}}
<body>
{{define "index"}}
<div class="wrapper">
<div class="page-content">
<div class="container">
<div class="left">
<img src="../public/images/img_landing_page_mac.png">
</div>
<div class="right">
<h2 style="font-size: 33px; letter-spacing: 5px">Organize <br>Modern Knowledge<br> for Mankind</h2>
<p style="font-size: 20px;margin-top: 35px;letter-spacing: 4px">Consume, Colect and Revisit <br>Knowledge at Your Fingertips</p>
<a href="#" style="margin-top: 80px;display: inline-block;margin-left: -17px"><img src="../public/images/btn_get_chrome.png"></a>
</div>
</div>
</div>
</div>
{{end}}
</body>
</html>
我错过了什么吗?我检查了"html/template".Must
的原型并没有得到发生的事情
答案 0 :(得分:1)
您不需要调用ParseFiles和Must,您可以调用其中一个
func RenderTemplate(w http.ResponseWriter, data interface{}, tmpl... string) {
cwd, _ := os.Getwd()
for _,file:=range tmpl{
file=filepath.Join(cwd,"./view/"+file+".html")
}
t, err := template.ParseFiles(tmpl...)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
err = t.Execute(w, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
我相信上面的功能应该做你想要的......
答案 1 :(得分:1)
template.Must()
有这个签名:
func Must(t *Template, err error) *Template
Must()
的论据是&#34;巧合&#34;与ParseFiles()
和ParseGlob()
的返回值相同,因此您可以在Must()
中使用这些函数,如果错误为非零,则会产生恐慌。所以你可以说
t := template.Must(template.ParseFiles(....))
并且不关心错误检查。这只是一个便利函数,类似于整个标准库中的所有其他Must()
函数,例如regexp.MustCompile()
。
Must()
的实施非常简单:
func Must(t *Template, err error) *Template {
if err != nil {
panic(err)
}
return t
}
请参阅https://golang.org/src/text/template/helper.go?s=576:619#L11