【问题标题】:template.Execute(): invalid memory address or nil pointer dereferencetemplate.Execute(): 无效的内存地址或 nil 指针取消引用
【发布时间】:2015-06-18 18:45:31
【问题描述】:

我正在尝试使用带有自定义分隔符的 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

【问题讨论】:

标签: go


【解决方案1】:

一个模板实际上可能包含多个要执行的“模板”。在这里,您实际上有 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 中修复的 bug(目前在 git master 中修复)。

【讨论】:

  • 要完全理解这个包我还有很长的路要走
  • @SasanRose:有时很难理解。另外,您遇到的 nil 指针恐慌是一个已在最新版本中修复的错误。 (您的代码仍然无法运行,但至少不会出现恐慌)
  • 您的代码从我的项目中删除了错误,但页面完全为空。模板的内容被删除。我使用 go appengine,最新版本是 go1.4.2。这是否意味着 appengine 用户存在该错误?
猜你喜欢
  • 2013-09-16
  • 2020-04-17
  • 2017-03-05
  • 2019-04-19
  • 2017-03-18
  • 2015-04-24
  • 2014-01-12
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多