Go – Why can’t the interface be implemented with pointer receivers

gointerfacepointers

I'm confused as to why this fails to compile with:

impossible type assertion:
Faz does not implement Foo (Bar method has pointer receiver)

if I make the receiver for Faz.Bar a Faz value rather than a Faz pointer then it compiles fine, but I thought it was always better to have pointer receivers so values aren't being copied around?

package main

import (
    "log"
)

func main() {
    foo := New().(Faz)
    log.Println(foo)
}

type Foo interface {
    Bar() string
}

func New() Foo {
    return &Faz{}
}

type Faz struct {
}

func (f *Faz) Bar() string {
    return `Bar`
}

Best Answer

Because it's *Faz not Faz.

func main() {
    foo := New().(*Faz)
    log.Println(foo)
}