Map entries are unaddressable

The Problem

The error: ./prog.go:15:10: cannot call pointer method on m[“bar”]
./prog.go:15:10: cannot take the address of m[“bar”]

package main

import (
    "fmt"
)

type Bar struct {}

func (b *Bar) Fizz() {
    fmt.Println("buzz")
}

func main() {
    m := map[string]Bar{"bar": Bar{}}
    m["bar"].Fizz()
}

The Solution

There are actually two different bugs here, hence the two different compile errors. The first bug is that the function Fizz is defined on a pointer receiver *Bar and m is a map of non-pointer Bar. Normally this isn’t an issue, because Go will automatically create a pointer to the object and then call Fizz on that. However, since map entries are not addressable, Go cannot create a pointer and this error occurs.

The fix: There are two ways to fix this. The first is to change m to type map[string]*Bar and then have &Bar{} as the value. The other solution shown below is to change the Fizz method to not be a pointer receiver.

package main

import (
    "fmt"
)

type Bar struct {}

func (b Bar) Fizz() {
    fmt.Println("buzz")
}

func main() {
    m := map[string]Bar{"bar": Bar{}}
    m["bar"].Fizz()
}

Further Reading

If you’re looking to get a deeper understanding of how Go application monitoring works, take a look at the following articles:

Expert

Evan Hicks

Do you like corporate newsletters?

Neither do we. Sign up anyway.

Want more banter/opinions?

Follow @getsentry on twitter
© 2021 • Sentry is a registered Trademark
of Functional Software, Inc.