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
Cause of the error Basically, in golang this error arises when you have a nil pointer in your code, and you are trying to get the value that it points to. If x is nil, an attempt to evaluate *x will cause a run-time panic. If you compile this code, you may sometimes encounter this error because : In the code, http.
Pointers can be dereferenced by adding an asterisk * before a pointer.
Occurs when a read or write instruction references memory that is logically or physically invalid. If present, represents the location and associated call stack from which the memory block containing the offending address was allocated.
Pointers in Go programming language or Golang is a variable that is used to store the memory address of another variable. Pointers in Golang is also termed as the special variables. The variables are used to store some data at a particular memory address in the system.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With