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.

The Experts

Evan Hicks

Working Code, Happy Users. Sentry Application Monitoring.

Fix Bugs Faster