30

Invalid memory address or nil pointer dereference

 3 years ago
source link: https://yourbasic.org/golang/gotcha-nil-pointer-dereference/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Invalid memory address or nil pointer dereference

yourbasic.org/golang
confused.jpg

Why does this program panic?

type Point struct {
    X, Y float64
}

func (p *Point) Abs() float64 {
    return math.Sqrt(p.X*p.X + p.Y*p.Y)
}

func main() {
    var p *Point
    fmt.Println(p.Abs())
}
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0xd2c5a]

goroutine 1 [running]:
main.(*Point).Abs(...)
	../main.go:6
main.main()
	../main.go:11 +0x1a

Answer

The uninitialized pointer p in the main function is nil, and you can’t follow the nil pointer.

If x is nil, an attempt to evaluate *x will cause a run-time panic. The Go Programming Language Specification: Address operators

You need to create a Point:

func main() {
    var p *Point = new(Point)
    fmt.Println(p.Abs())
}

Since methods with pointer receivers take either a value or a pointer, you could also skip the pointer altogether:

func main() {
    var p Point // has zero value Point{X:0, Y:0}
    fmt.Println(p.Abs())
}

See Pointers for more about pointers in Go.

Share:             


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK