当前位置: 首页 > 知识库问答 >
问题:

模板。执行():无效的内存地址或零指针取消引用

邹宣
2023-03-14

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

共有1个答案

燕涵容
2023-03-14

一个模板实际上可能包含多个要执行的“模板”。这里实际上有两个模板;一个名为“test”的带有自定义分隔符的nil模板,以及一个名为“index.html”的已解析模板。

您可以将第一个命名为与索引模板相同的名称

var sherrifTmpl = template.New("index.html").Delims("{[{", "}]}")

或者您可以使用ExecuteTemplate按名称调用模板

template.Must(sherrifTmpl.ParseFiles("index.html")).ExecuteTemplate(w, "index.html", r)

html/模板包在这种情况下仍然不应该惊慌。这是一个将在go1.5中修复的错误(目前在git master中修复)。

 类似资料:
  • 我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)): 我的gcc: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?

  • 我收到一个无效内存地址的运行时错误。 channel.go看起来像这样: 第36行怎么可能导致这种情况?m是否有可能为零?如果是,如何? 注意:哈希定义为字符串

  • 我是新手,试图制作一个简单的网络爬虫。我一直收到“恐慌:运行时错误:无效的内存地址或零指针取消引用”,不知道如何解决这个问题。我有一个“AdvancedFetcher”函数和一个“basicFetcher”函数,我在其中任何一个下都收到相同的错误。这个答案建议检查每个错误(我想我有),但我仍然收到错误。谢谢! 编辑#1:

  • 我是golang的新手,目前正在学习本教程和源代码-http://golang.org/doc/articles/wiki/part2.go 创建此文件后,我将 知道我做错了什么导致了这种明显的记忆损坏吗?

  • 调用原子。结构字段上的AddInt64会恐慌,但当我们重新排列字段顺序时不会;为什么? 使用此类型: 并调用

  • 运行Go程序时,它会惊慌失措并返回以下信息: 我查看了其他人对相同异常的响应,但没有看到任何简单的响应(即未处理的错误)。 我在一台无法访问代码中列出的API服务器的机器上运行它,但我希望它会返回一个适当的错误(因为我试图捕捉这种错误)。