Method Pointer Receivers in Interfaces

Evan Hicks

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:

Join the discussionCome work with us
Share on Twitter
Bookmark this page
Ask a questionImprove this Answer

Related Answers

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

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