Sentry Answers>Go>

Map Entries are Unaddressable

Map Entries are Unaddressable

Evan Hicks

The ProblemJump To Solution

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
  • Syntax.fm logo
    Listen to the Syntax Podcast

    Tasty Treats for Web Developers brought to you by Sentry. Web development tips and tricks hosted by Wes Bos and Scott Tolinski

    Listen to Syntax

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.

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