Unexpected invalid memory address or nil pointer dereference
go
Solution
This means that `Attributes` is being called with receiver `m` as `nil`.
In principle methods can be called with `nil` receivers (and this may even be useful if they check for `nil`) - see here - but this particular method `Attributes()` is not designed to be called with a `nil` receiver, as `m` is being dereferenced without a `nil` check. This (method being called with a `nil` receiver `m`) is what is happening in your calling code.
See a simplified example on the playground here, and note that commenting out `+ m.hash` makes the whole thing work fine, as here.
Code below:
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()
}
The output of which is:
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
Problem
I'm getting a runtime error for an invalid memory address. ``` 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 looks like this: ``` 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 } ``` How is it possible that the line 36 is causing this? Is it somehow possible for `m` to be nil? If so, how? Note: hash is defined as string