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

意外的无效内存地址或零指针取消引用

夹谷英杰
2023-03-14

我收到一个无效内存地址的运行时错误。

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x4e0f24]

goroutine 1192592 [running]:
panic(0x793540, 0xc420010040)
#011/usr/local/go/src/runtime/panic.go:500 +0x1a1
foobar/sd.(*Channel).Attributes(0x0, 0xc420110101, 0xc42278f9b0, 0x9)
#011/home/app/go/src/foobar/sd/channel.go:36 +0x54

channel.go看起来像这样:

35 func (m *Channel) Attributes() (*ChannelAttrs, error) {
36    redisHash := "sd:channels:" + m.hash
37
38    rc := m.ctx.RedisPool.Get()
39    values, err := redis.Values(rc.Do("HGETALL", redisHash))
40    rc.Close()
41    if err != nil {
42        return nil, err
43    }
44    attrs := ChannelAttrs{}
45    redis.ScanStruct(values, &attrs)
46    return &attrs, nil
47 }

第36行怎么可能导致这种情况?m是否有可能为零?如果是,如何?

注意:哈希定义为字符串

共有1个答案

赖诚
2023-03-14

这意味着正在使用receiverm作为nil调用属性

原则上,方法可以通过nil接收器调用(如果它们检查nil),这甚至可能很有用-请参见此处-但是这个特定的方法Attributes()不是设计为通过nil接收器调用的,因为在没有检查nil的情况下对m进行解引用。这就是调用代码中发生的情况(使用nil接收器调用方法)。

在这里查看操场上的一个简化示例,并注意注释掉m.hash会使整个事情正常工作,就像这里一样。

代码如下:

package main

import (
    "fmt"
)

type Channel struct {
    hash string
}

func (m *Channel) Attributes() {
    r := "x" + m.hash
    fmt.Println(r)
}

func main() {
    var c *Channel
    c.Attributes()
}

其输出为:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x20131]

goroutine 1 [running]:
panic(0x102360, 0x1040a038)
    /usr/local/go/src/runtime/panic.go:500 +0x720
main.(*Channel).Attributes(0x0, 0x104000f0)
/tmp/sandbox285779060/main.go:12 +0x131
main.main()
    /tmp/sandbox285779060/main.go:18 +0x20

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

  • 我正在尝试使用带有自定义分隔符的Go html/模板。 但是,我可以解析并执行我的“index.html”文件,每当我试图更改模板分隔符时,我都会遇到以下错误: 这是我的代码: 如果我尝试以下任何一种: 或: 一切正常。我甚至试图捕捉ParseFiles错误。但仍然没有运气: 我看不出我做错了什么。如果你们中的任何人能在这个问题上帮助我,我将不胜感激。 更新1: 这就是恐慌:

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

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

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

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