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

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不知何故有可能是零吗?如果是这样的话,是如何做到的呢?

注意:哈希定义为字符串

推荐答案

这意味着正在使用接收器m作为nil来调用Attributes.

原则上,方法可以用nil个接收器来调用(如果它们判断nil,这甚至可能是有用的)-参见here-但是这个特定的方法Attributes()不被设计成用nil个接收器来调用,因为m在没有nil判断的情况下被解除引用.这个(使用nil接收器m调用的方法)就是在您的调用代码中发生的事情.

请参见简化的示例on the playground here,请注意,注释掉+ m.hash会使整个工作正常,如here.

代码如下:

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

Go相关问答推荐

如何修复在Go API中使用Gin Framework的请求资源上没有使用Gin Framework的请求源的消息?''

如何将泛型函数作为参数传递给golang中的另一个函数?

+在具有html/模板Golang的Base64中

如何在v2 Go SDK中使用KeyConditionExpression查询AWS DynamoDb?

通过渠道和goroutines增值1000倍

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

使用Go和Operator SDK通过API调用设置Kubernetes Pods的安装步骤

如何用mpb创建两行进度条?

对 CSV 进行单元测试失败

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

整理时转换值

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

为什么 0 big.Int 的 .Bytes() 值是空切片?

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

Unescape 在 rss 中两次逃脱了标题

出于某种原因,Golang (Go) AES CBC 密文被填充了 16 个 0x00 字节

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?