我正在尝试使用带有自定义分隔符的Go html /模板。
但是,我可以解析并执行我的" index.html"文件,每当我试图更改我的模板分隔符我面临以下错误:
runtime error: invalid memory address or nil pointer dereference goroutine
这是我的代码:
package main
import (
"html/template"
"net/http"
)
var sherrifTmpl = template.New("test").Delims("{[{", "}]}")
func serveHome(w http.ResponseWriter, r *http.Request) {
template.Must(sherrifTmpl.ParseFiles("index.html")).Execute(w, r)
}
如果我尝试以下任何一项:
package main
import (
"html/template"
"net/http"
)
func serveHome(w http.ResponseWriter, r *http.Request) {
template.Must(template.ParseFiles("index.html")).Execute(w, r)
}
或者:
package main
import (
"html/template"
"net/http"
)
var sherrifTmpl = template.New("test").Delims("{[{", "}]}")
func serveHome(w http.ResponseWriter, r *http.Request) {
template.Must(sherrifTmpl.ParseFiles("{[{.Host}]}")).Execute(w, r)
}
一切正常。我甚至试图捕获ParseFiles错误。但仍然没有运气:
package main
import (
"html/template"
"net/http"
)
var sherrifTmpl = template.New("test").Delims("{[{", "}]}")
func serveHome(w http.ResponseWriter, r *http.Request) {
homeTmpl, err := sherrifTmpl.ParseFiles("index.html")
if err != nil {
panic(err)
}
homeTmpl.Execute(w, r)
}
我无法看到我做错了什么。如果你们中的任何人能帮助我解决这个问题,我将不胜感激。
更新1:
这是恐慌:
2015/04/13 17:43:35 http: panic serving 127.0.0.1:56634: runtime error: invalid memory address or nil pointer dereference
goroutine 5 [running]:
net/http.func·011()
/usr/local/go/src/net/http/server.go:1130 +0xbb
html/template.(*Template).escape(0xc20803ad80, 0x0, 0x0)
/usr/local/go/src/html/template/template.go:59 +0xe4
html/template.(*Template).Execute(0xc20803ad80, 0x7f550e16f420, 0xc20805cd20, 0x7280c0, 0xc208032ea0, 0x0, 0x0)
/usr/local/go/src/html/template/template.go:75 +0x3d
main.serveHome(0x7f550e16f328, 0xc20805cd20, 0xc208032ea0)
/home/sasan/Works/Karina/Mobazi/Mon-Panel/routes.go:11 +0x136
net/http.HandlerFunc.ServeHTTP(0x7eb738, 0x7f550e16f328, 0xc20805cd20, 0xc208032ea0)
/usr/local/go/src/net/http/server.go:1265 +0x41
net/http.(*ServeMux).ServeHTTP(0xc20803a6c0, 0x7f550e16f328, 0xc20805cd20, 0xc208032ea0)
/usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20805a0c0, 0x7f550e16f328, 0xc20805cd20, 0xc208032ea0)
/usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc20805cc80)
/usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:1751 +0x35e
答案 0 :(得分:8)
模板实际上可能包含多个"模板"执行。这里你实际上有2个模板;一个名为" test"的nil模板使用自定义分隔符和名为" index.html"的已解析模板。
您可以将第一个名称命名为索引模板
var sherrifTmpl = template.New("index.html").Delims("{[{", "}]}")
或者您可以使用ExecuteTemplate
template.Must(sherrifTmpl.ParseFiles("index.html")).ExecuteTemplate(w, "index.html", r)
html/template
套餐在这种情况下仍然不应该发生恐慌。这是一个将在go1.5中修复的错误(目前已在git master中修复)。