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

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:

Loved by over 4 million developers and more than 90,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.

Share on Twitter
Bookmark this page
Ask a questionJoin the discussion

Related Answers

A better experience for your users. An easier life for your developers.

    TwitterGitHubDribbbleLinkedinDiscord
© 2024 • Sentry is a registered Trademark
of Functional Software, Inc.