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() }
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() }
If you’re looking to get a deeper understanding of how Go application monitoring works, take a look at the following articles: