Sentry Answers>Go>

Map Entries are Unaddressable

Map Entries are Unaddressable

Evan Hicks

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”]

Click to Copy
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.

Click to Copy
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:

  • SentryGo Error Tracking and Performance Monitoring (opens in a new tab)
  • Syntax.fmListen to the Syntax Podcast (opens in a new tab)
  • Syntax.fm logo
    Listen to the Syntax Podcast (opens in a new tab)

    Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.

    SEE EPISODES

Considered “not bad” by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.