Method Pointer Receivers in Interfaces
The Problem
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)
}
The Solution
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.
Further Reading
If you’re looking to get a deeper understanding of how Go application monitoring works, take a look at the following articles:
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.