The error: ./prog.go:23:7: cannot use b (type Bar) as type Foo in argument to Fizzy: Bar does not implement Foo (Fizz method has pointer receiver)
package main import ( "fmt" ) type Foo interface { Fizz() } type Bar struct {} func (b *Bar) Fizz() { fmt.Println("fizz") } func Fizzy(foo Foo) { foo.Fizz() } func main() { b := Bar{} Fizzy(b) }
This error happens because the pointer to a type is its own unique type. In this example, *Bar
is a different type to Bar
. The method receiver Fizz
is defined on the *Bar
type, not the Bar
type. So only *Bar
satisfies the interface Foo
.
The fix:
package main import ( "fmt" ) type Foo interface { Fizz() } type Bar struct {} func (b *Bar) Fizz() { fmt.Println("fizz") } func Fizzy(foo Foo) { foo.Fizz() } func main() { b := &Bar{} Fizzy(b) }
Change b
to a pointer to a Bar
. Since *Bar
satisfies the interface Foo
, b
can now be used as a function argument to Fizzy
.
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.